diff --git a/DEPS b/DEPS
index 4aa02b9..29a42c9 100644
--- a/DEPS
+++ b/DEPS
@@ -36,15 +36,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling sfntly
   # and whatever else without interference from each other.
-  'sfntly_revision': '84f71089cb80e6ed31d87f3aa5caab43f1427e85',
+  'sfntly_revision': 'de3cce5660f5e45f3babcb46c7500905d5346510',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '31f96a68af509f41ed0ffb2145f355229ae9aaf0',
+  'skia_revision': 'd003e24f3f6ef3adeae9d83a62a906247c161bfc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '982b0294ef633e9c9aff1fe76e9e24cd62e1307d',
+  'v8_revision': '7448b9f988d16f6a4ba1cf78f59924fcff04dc90',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -64,7 +64,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '73b607fcb5f904893a0610b2c7fb8726d09379e6',
+  'pdfium_revision': 'b8227824c221733e8636c42c3aee8ccff9efd719',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -96,11 +96,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '517173b5db312870e2a97902f9a23cac7c65f924',
+  'catapult_revision': '0cfeabf7007c77377dc389331d723d5e41d8c911',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
-  'libfuzzer_revision': 'b9454401d363391ee7a685401a3fdc1775407cfc',
+  'libfuzzer_revision': '57ed3860456328e3f0aaad02dc8153d5ac023d59',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-node-modules
   # and whatever else without interference from each other.
@@ -369,7 +369,7 @@
       Var('chromium_git') + '/external/github.com/material-foundation/material-font-disk-loader-ios.git' + '@' + '8e30188777b016182658fbaa0a4a020a48183224',
 
     'src/ios/third_party/material_roboto_font_loader_ios/src':
-      Var('chromium_git') + '/external/github.com/material-foundation/material-roboto-font-loader-ios.git' + '@' + 'c9e9be95578fdf853c1e197d0e19dce1ceffc918',
+      Var('chromium_git') + '/external/github.com/material-foundation/material-roboto-font-loader-ios.git' + '@' + '4aa51e906e5671c71d24e991f1f10d782a58409f',
 
     'src/ios/third_party/material_sprited_animation_view_ios/src':
       Var('chromium_git') + '/external/github.com/material-foundation/material-sprited-animation-view-ios.git' + '@' + 'c6e16d06bdafd95540c62b3402d9414692fbca81',
@@ -1035,13 +1035,6 @@
     ],
   },
   {
-    # Pull sanitizer-instrumented third-party libraries if requested via
-    # GYP_DEFINES.
-    'name': 'instrumented_libraries',
-    'pattern': '\\.sha1',
-    'action': ['python', 'src/third_party/instrumented_libraries/scripts/download_binaries.py'],
-  },
-  {
     # Pull doclava binaries if building for Android.
     'name': 'doclava',
     'pattern': '.',
diff --git a/ash/accelerators/accelerator_interactive_uitest_chromeos.cc b/ash/accelerators/accelerator_interactive_uitest_chromeos.cc
index 4e8d25c..48ca2b9 100644
--- a/ash/accelerators/accelerator_interactive_uitest_chromeos.cc
+++ b/ash/accelerators/accelerator_interactive_uitest_chromeos.cc
@@ -9,7 +9,6 @@
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/wm/window_state.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/test/ash_interactive_ui_test_base.h"
 #include "ash/test/test_screenshot_delegate.h"
@@ -183,7 +182,7 @@
 
   // Test TOGGLE_WIFI.
   TestNetworkObserver network_observer;
-  WmShell::Get()->system_tray_notifier()->AddNetworkObserver(&network_observer);
+  Shell::Get()->system_tray_notifier()->AddNetworkObserver(&network_observer);
 
   EXPECT_FALSE(network_observer.wifi_enabled_status());
   SendKeyPressSync(ui::VKEY_WLAN, false, false, false);
@@ -191,7 +190,7 @@
   SendKeyPressSync(ui::VKEY_WLAN, false, false, false);
   EXPECT_FALSE(network_observer.wifi_enabled_status());
 
-  WmShell::Get()->system_tray_notifier()->RemoveNetworkObserver(
+  Shell::Get()->system_tray_notifier()->RemoveNetworkObserver(
       &network_observer);
 }
 
diff --git a/ash/ash_touch_exploration_manager_chromeos.cc b/ash/ash_touch_exploration_manager_chromeos.cc
index 873f6361..cfbdf23 100644
--- a/ash/ash_touch_exploration_manager_chromeos.cc
+++ b/ash/ash_touch_exploration_manager_chromeos.cc
@@ -6,7 +6,6 @@
 
 #include "ash/common/accessibility_delegate.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
 #include "ash/root_window_controller.h"
 #include "ash/shared/app_types.h"
@@ -30,7 +29,7 @@
       enable_chromevox_arc_support_(
           base::CommandLine::ForCurrentProcess()->HasSwitch(
               chromeos::switches::kEnableChromeVoxArcSupport)) {
-  WmShell::Get()->system_tray_notifier()->AddAccessibilityObserver(this);
+  Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(this);
   Shell::GetInstance()->activation_client()->AddObserver(this);
   display::Screen::GetScreen()->AddObserver(this);
   UpdateTouchExplorationState();
@@ -38,7 +37,7 @@
 
 AshTouchExplorationManager::~AshTouchExplorationManager() {
   SystemTrayNotifier* system_tray_notifier =
-      WmShell::Get()->system_tray_notifier();
+      Shell::Get()->system_tray_notifier();
   if (system_tray_notifier)
     system_tray_notifier->RemoveAccessibilityObserver(this);
   Shell::GetInstance()->activation_client()->RemoveObserver(this);
diff --git a/ash/common/accelerators/accelerator_controller.cc b/ash/common/accelerators/accelerator_controller.cc
index eff6d9a..4bdf93b 100644
--- a/ash/common/accelerators/accelerator_controller.cc
+++ b/ash/common/accelerators/accelerator_controller.cc
@@ -175,7 +175,7 @@
   if (accelerator.key_code() == ui::VKEY_TAB)
     base::RecordAction(base::UserMetricsAction("Accel_PrevWindow_Tab"));
 
-  WmShell::Get()->window_cycle_controller()->HandleCycleWindow(
+  Shell::Get()->window_cycle_controller()->HandleCycleWindow(
       WindowCycleController::BACKWARD);
 }
 
@@ -183,7 +183,7 @@
   if (accelerator.key_code() == ui::VKEY_TAB)
     base::RecordAction(base::UserMetricsAction("Accel_NextWindow_Tab"));
 
-  WmShell::Get()->window_cycle_controller()->HandleCycleWindow(
+  Shell::Get()->window_cycle_controller()->HandleCycleWindow(
       WindowCycleController::FORWARD);
 }
 
@@ -401,7 +401,7 @@
 
 void HandleToggleOverview() {
   base::RecordAction(base::UserMetricsAction("Accel_Overview_F5"));
-  WmShell::Get()->window_selector_controller()->ToggleOverview();
+  Shell::Get()->window_selector_controller()->ToggleOverview();
 }
 
 bool CanHandleWindowSnap() {
@@ -1188,7 +1188,7 @@
       HandleToggleSpokenFeedback();
       break;
     case TOGGLE_WIFI:
-      WmShell::Get()->system_tray_notifier()->NotifyRequestToggleWifi();
+      Shell::Get()->system_tray_notifier()->NotifyRequestToggleWifi();
       break;
     case VOLUME_DOWN:
       HandleVolumeDown(volume_controller_.get(), accelerator);
diff --git a/ash/common/keyboard/keyboard_ui.cc b/ash/common/keyboard/keyboard_ui.cc
index b5f8a559..f7be5dc 100644
--- a/ash/common/keyboard/keyboard_ui.cc
+++ b/ash/common/keyboard/keyboard_ui.cc
@@ -9,7 +9,6 @@
 #include "ash/common/system/accessibility_observer.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/system/tray_accessibility.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "base/memory/ptr_util.h"
 #include "ui/keyboard/keyboard_controller.h"
@@ -19,12 +18,12 @@
 class KeyboardUIImpl : public KeyboardUI, public AccessibilityObserver {
  public:
   KeyboardUIImpl() : enabled_(false) {
-    WmShell::Get()->system_tray_notifier()->AddAccessibilityObserver(this);
+    Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(this);
   }
 
   ~KeyboardUIImpl() override {
-    if (WmShell::HasInstance() && WmShell::Get()->system_tray_notifier())
-      WmShell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(this);
+    if (Shell::HasInstance() && Shell::Get()->system_tray_notifier())
+      Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(this);
   }
 
   // KeyboardUI:
diff --git a/ash/common/mojo_interface_factory.cc b/ash/common/mojo_interface_factory.cc
index 975c6e8..e18be58 100644
--- a/ash/common/mojo_interface_factory.cc
+++ b/ash/common/mojo_interface_factory.cc
@@ -19,7 +19,6 @@
 #include "ash/common/system/tray/system_tray_controller.h"
 #include "ash/common/wallpaper/wallpaper_controller.h"
 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "base/bind.h"
 #include "services/service_manager/public/cpp/interface_registry.h"
@@ -69,7 +68,7 @@
 
 void BindShutdownControllerRequestOnMainThread(
     mojom::ShutdownControllerRequest request) {
-  WmShell::Get()->shutdown_controller()->BindRequest(std::move(request));
+  Shell::Get()->shutdown_controller()->BindRequest(std::move(request));
 }
 
 void BindSystemTrayRequestOnMainThread(mojom::SystemTrayRequest request) {
@@ -81,7 +80,7 @@
 }
 
 void BindVpnListRequestOnMainThread(mojom::VpnListRequest request) {
-  WmShell::Get()->vpn_list()->BindRequest(std::move(request));
+  Shell::Get()->vpn_list()->BindRequest(std::move(request));
 }
 
 void BindWallpaperRequestOnMainThread(
diff --git a/ash/common/system/chromeos/bluetooth/tray_bluetooth.cc b/ash/common/system/chromeos/bluetooth/tray_bluetooth.cc
index 436c194..3b6e75e4 100644
--- a/ash/common/system/chromeos/bluetooth/tray_bluetooth.cc
+++ b/ash/common/system/chromeos/bluetooth/tray_bluetooth.cc
@@ -597,11 +597,11 @@
     : SystemTrayItem(system_tray, UMA_BLUETOOTH),
       default_(nullptr),
       detailed_(nullptr) {
-  WmShell::Get()->system_tray_notifier()->AddBluetoothObserver(this);
+  Shell::Get()->system_tray_notifier()->AddBluetoothObserver(this);
 }
 
 TrayBluetooth::~TrayBluetooth() {
-  WmShell::Get()->system_tray_notifier()->RemoveBluetoothObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveBluetoothObserver(this);
 }
 
 views::View* TrayBluetooth::CreateTrayView(LoginStatus status) {
diff --git a/ash/common/system/chromeos/bluetooth/tray_bluetooth_helper.cc b/ash/common/system/chromeos/bluetooth/tray_bluetooth_helper.cc
index 9af326d..41b0cf1 100644
--- a/ash/common/system/chromeos/bluetooth/tray_bluetooth_helper.cc
+++ b/ash/common/system/chromeos/bluetooth/tray_bluetooth_helper.cc
@@ -6,7 +6,6 @@
 
 #include "ash/common/system/tray/system_tray_controller.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -27,7 +26,7 @@
     device::BluetoothDevice::ConnectErrorCode error_code) {}
 
 ash::SystemTrayNotifier* GetSystemTrayNotifier() {
-  return WmShell::Get()->system_tray_notifier();
+  return Shell::Get()->system_tray_notifier();
 }
 
 }  // namespace
diff --git a/ash/common/system/chromeos/enterprise/tray_enterprise.cc b/ash/common/system/chromeos/enterprise/tray_enterprise.cc
index 6083dfa..e613047 100644
--- a/ash/common/system/chromeos/enterprise/tray_enterprise.cc
+++ b/ash/common/system/chromeos/enterprise/tray_enterprise.cc
@@ -8,7 +8,6 @@
 #include "ash/common/system/tray/label_tray_view.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
 #include "ash/resources/grit/ash_resources.h"
 #include "ash/shell.h"
 #include "base/logging.h"
@@ -18,11 +17,11 @@
 
 TrayEnterprise::TrayEnterprise(SystemTray* system_tray)
     : SystemTrayItem(system_tray, UMA_ENTERPRISE), tray_view_(nullptr) {
-  WmShell::Get()->system_tray_notifier()->AddEnterpriseDomainObserver(this);
+  Shell::Get()->system_tray_notifier()->AddEnterpriseDomainObserver(this);
 }
 
 TrayEnterprise::~TrayEnterprise() {
-  WmShell::Get()->system_tray_notifier()->RemoveEnterpriseDomainObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveEnterpriseDomainObserver(this);
 }
 
 void TrayEnterprise::UpdateEnterpriseMessage() {
diff --git a/ash/common/system/chromeos/ime_menu/ime_menu_tray.cc b/ash/common/system/chromeos/ime_menu/ime_menu_tray.cc
index d470793..a783d08 100644
--- a/ash/common/system/chromeos/ime_menu/ime_menu_tray.cc
+++ b/ash/common/system/chromeos/ime_menu/ime_menu_tray.cc
@@ -360,7 +360,7 @@
     SetInkDropMode(InkDropMode::ON);
   SetupLabelForTray(label_);
   tray_container()->AddChildView(label_);
-  SystemTrayNotifier* tray_notifier = WmShell::Get()->system_tray_notifier();
+  SystemTrayNotifier* tray_notifier = Shell::Get()->system_tray_notifier();
   tray_notifier->AddIMEObserver(this);
   tray_notifier->AddVirtualKeyboardObserver(this);
 }
@@ -368,7 +368,7 @@
 ImeMenuTray::~ImeMenuTray() {
   if (bubble_)
     bubble_->bubble_view()->reset_delegate();
-  SystemTrayNotifier* tray_notifier = WmShell::Get()->system_tray_notifier();
+  SystemTrayNotifier* tray_notifier = Shell::Get()->system_tray_notifier();
   tray_notifier->RemoveIMEObserver(this);
   tray_notifier->RemoveVirtualKeyboardObserver(this);
   keyboard::KeyboardController* keyboard_controller =
diff --git a/ash/common/system/chromeos/ime_menu/ime_menu_tray_unittest.cc b/ash/common/system/chromeos/ime_menu/ime_menu_tray_unittest.cc
index 89e0f1e1..1b8273e8 100644
--- a/ash/common/system/chromeos/ime_menu/ime_menu_tray_unittest.cc
+++ b/ash/common/system/chromeos/ime_menu/ime_menu_tray_unittest.cc
@@ -11,7 +11,6 @@
 #include "ash/common/system/tray/ime_info.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/test/test_system_tray_delegate.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/status_area_widget_test_helper.h"
@@ -97,16 +96,16 @@
 TEST_F(ImeMenuTrayTest, ImeMenuTrayVisibility) {
   ASSERT_FALSE(IsVisible());
 
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
   EXPECT_TRUE(IsVisible());
 
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(false);
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(false);
   EXPECT_FALSE(IsVisible());
 }
 
 // Tests that IME menu tray shows the right info of the current IME.
 TEST_F(ImeMenuTrayTest, TrayLabelTest) {
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
   ASSERT_TRUE(IsVisible());
 
   // Changes the input method to "ime1".
@@ -118,7 +117,7 @@
   info1.third_party = false;
   info1.selected = true;
   GetSystemTrayDelegate()->SetCurrentIME(info1);
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIME();
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIME();
   EXPECT_EQ(UTF8ToUTF16("US"), GetTrayText());
 
   // Changes the input method to a third-party IME extension.
@@ -130,7 +129,7 @@
   info2.third_party = true;
   info2.selected = true;
   GetSystemTrayDelegate()->SetCurrentIME(info2);
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIME();
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIME();
   EXPECT_EQ(UTF8ToUTF16("UK*"), GetTrayText());
 }
 
@@ -138,7 +137,7 @@
 // tests that the background color becomes 'inactive' when disabling the IME
 // menu feature.
 TEST_F(ImeMenuTrayTest, PerformAction) {
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
   ASSERT_TRUE(IsVisible());
   ASSERT_FALSE(IsTrayBackgroundActive());
 
@@ -156,7 +155,7 @@
   // element will be deactivated.
   GetTray()->PerformAction(tap);
   EXPECT_TRUE(IsTrayBackgroundActive());
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(false);
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(false);
   EXPECT_FALSE(IsVisible());
   EXPECT_FALSE(IsBubbleShown());
   EXPECT_FALSE(IsTrayBackgroundActive());
@@ -199,7 +198,7 @@
 
   GetSystemTrayDelegate()->SetAvailableIMEList(ime_info_list);
   GetSystemTrayDelegate()->SetCurrentIME(info1);
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIME();
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIME();
   EXPECT_EQ(UTF8ToUTF16("US"), GetTrayText());
   EXPECT_TRUE(IsTrayImeListValid(ime_info_list, info1));
 
@@ -207,7 +206,7 @@
   ime_info_list[2].selected = true;
   GetSystemTrayDelegate()->SetAvailableIMEList(ime_info_list);
   GetSystemTrayDelegate()->SetCurrentIME(info3);
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIME();
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIME();
   EXPECT_EQ(UTF8ToUTF16("拼"), GetTrayText());
   EXPECT_TRUE(IsTrayImeListValid(ime_info_list, info3));
 
@@ -219,7 +218,7 @@
 
 // Tests that quits Chrome with IME menu openned will not crash.
 TEST_F(ImeMenuTrayTest, QuitChromeWithMenuOpen) {
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
   ASSERT_TRUE(IsVisible());
   ASSERT_FALSE(IsTrayBackgroundActive());
 
@@ -232,7 +231,7 @@
 
 // Tests using 'Alt+Shift+K' to open the menu.
 TEST_F(ImeMenuTrayTest, TestAccelerator) {
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
   ASSERT_TRUE(IsVisible());
   ASSERT_FALSE(IsTrayBackgroundActive());
 
@@ -249,7 +248,7 @@
 }
 
 TEST_F(ImeMenuTrayTest, ShowEmojiKeyset) {
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
+  Shell::Get()->system_tray_notifier()->NotifyRefreshIMEMenu(true);
   ASSERT_TRUE(IsVisible());
   ASSERT_FALSE(IsTrayBackgroundActive());
 
diff --git a/ash/common/system/chromeos/network/tray_network.cc b/ash/common/system/chromeos/network/tray_network.cc
index 5bcff2a..6f5d847e 100644
--- a/ash/common/system/chromeos/network/tray_network.cc
+++ b/ash/common/system/chromeos/network/tray_network.cc
@@ -19,6 +19,7 @@
 #include "ash/common/system/tray/tray_popup_item_style.h"
 #include "ash/common/system/tray/tray_utils.h"
 #include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/command_line.h"
 #include "base/strings/utf_string_conversions.h"
@@ -230,13 +231,13 @@
       detailed_(NULL),
       request_wifi_view_(false) {
   network_state_observer_.reset(new TrayNetworkStateObserver(this));
-  SystemTrayNotifier* notifier = WmShell::Get()->system_tray_notifier();
+  SystemTrayNotifier* notifier = Shell::Get()->system_tray_notifier();
   notifier->AddNetworkObserver(this);
   notifier->AddNetworkPortalDetectorObserver(this);
 }
 
 TrayNetwork::~TrayNetwork() {
-  SystemTrayNotifier* notifier = WmShell::Get()->system_tray_notifier();
+  SystemTrayNotifier* notifier = Shell::Get()->system_tray_notifier();
   notifier->RemoveNetworkObserver(this);
   notifier->RemoveNetworkPortalDetectorObserver(this);
 }
diff --git a/ash/common/system/chromeos/network/tray_vpn.cc b/ash/common/system/chromeos/network/tray_vpn.cc
index 38379de..f9ffe1b 100644
--- a/ash/common/system/chromeos/network/tray_vpn.cc
+++ b/ash/common/system/chromeos/network/tray_vpn.cc
@@ -45,7 +45,7 @@
   static bool ShouldShow() {
     // Show the VPN entry in the ash tray bubble if at least one third-party VPN
     // provider is installed.
-    if (WmShell::Get()->vpn_list()->HaveThirdPartyVPNProviders())
+    if (Shell::Get()->vpn_list()->HaveThirdPartyVPNProviders())
       return true;
 
     // Also show the VPN entry if at least one VPN network is configured.
diff --git a/ash/common/system/chromeos/network/vpn_list_view.cc b/ash/common/system/chromeos/network/vpn_list_view.cc
index 8069efb..2720c570 100644
--- a/ash/common/system/chromeos/network/vpn_list_view.cc
+++ b/ash/common/system/chromeos/network/vpn_list_view.cc
@@ -245,11 +245,11 @@
 }  // namespace
 
 VPNListView::VPNListView(NetworkListDelegate* delegate) : delegate_(delegate) {
-  WmShell::Get()->vpn_list()->AddObserver(this);
+  Shell::Get()->vpn_list()->AddObserver(this);
 }
 
 VPNListView::~VPNListView() {
-  WmShell::Get()->vpn_list()->RemoveObserver(this);
+  Shell::Get()->vpn_list()->RemoveObserver(this);
 }
 
 void VPNListView::Update() {
@@ -397,7 +397,7 @@
     const chromeos::NetworkStateHandler::NetworkStateList& networks) {
   // Get the list of VPN providers enabled in the primary user's profile.
   std::vector<VPNProvider> providers =
-      WmShell::Get()->vpn_list()->vpn_providers();
+      Shell::Get()->vpn_list()->vpn_providers();
 
   // Add providers with at least one configured network along with their
   // networks. Providers are added in the order of their highest priority
diff --git a/ash/common/system/chromeos/screen_security/screen_capture_tray_item.cc b/ash/common/system/chromeos/screen_security/screen_capture_tray_item.cc
index daa53f7..3920c4ed 100644
--- a/ash/common/system/chromeos/screen_security/screen_capture_tray_item.cc
+++ b/ash/common/system/chromeos/screen_security/screen_capture_tray_item.cc
@@ -30,12 +30,12 @@
 ScreenCaptureTrayItem::ScreenCaptureTrayItem(SystemTray* system_tray)
     : ScreenTrayItem(system_tray, UMA_SCREEN_CAPTURE) {
   Shell::GetInstance()->AddShellObserver(this);
-  WmShell::Get()->system_tray_notifier()->AddScreenCaptureObserver(this);
+  Shell::Get()->system_tray_notifier()->AddScreenCaptureObserver(this);
 }
 
 ScreenCaptureTrayItem::~ScreenCaptureTrayItem() {
   Shell::GetInstance()->RemoveShellObserver(this);
-  WmShell::Get()->system_tray_notifier()->RemoveScreenCaptureObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveScreenCaptureObserver(this);
 }
 
 views::View* ScreenCaptureTrayItem::CreateDefaultView(LoginStatus status) {
diff --git a/ash/common/system/chromeos/screen_security/screen_share_tray_item.cc b/ash/common/system/chromeos/screen_security/screen_share_tray_item.cc
index 61d2632..d5f5cc3 100644
--- a/ash/common/system/chromeos/screen_security/screen_share_tray_item.cc
+++ b/ash/common/system/chromeos/screen_security/screen_share_tray_item.cc
@@ -8,8 +8,8 @@
 
 #include "ash/common/system/system_notifier.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
 #include "ash/resources/grit/ash_resources.h"
+#include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -26,11 +26,11 @@
 
 ScreenShareTrayItem::ScreenShareTrayItem(SystemTray* system_tray)
     : ScreenTrayItem(system_tray, UMA_SCREEN_SHARE) {
-  WmShell::Get()->system_tray_notifier()->AddScreenShareObserver(this);
+  Shell::Get()->system_tray_notifier()->AddScreenShareObserver(this);
 }
 
 ScreenShareTrayItem::~ScreenShareTrayItem() {
-  WmShell::Get()->system_tray_notifier()->RemoveScreenShareObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveScreenShareObserver(this);
 }
 
 views::View* ScreenShareTrayItem::CreateDefaultView(LoginStatus status) {
diff --git a/ash/common/system/chromeos/screen_security/screen_tray_item_unittest.cc b/ash/common/system/chromeos/screen_security/screen_tray_item_unittest.cc
index 2e00fc5..5925084b 100644
--- a/ash/common/system/chromeos/screen_security/screen_tray_item_unittest.cc
+++ b/ash/common/system/chromeos/screen_security/screen_tray_item_unittest.cc
@@ -10,7 +10,7 @@
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/system/tray/tray_item_view.h"
 #include "ash/common/test/ash_test.h"
-#include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 #include "base/callback.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -143,13 +143,13 @@
 TEST_F(ScreenCaptureTest, NotificationStartAndStop) {
   base::Closure start_function = base::Bind(
       &SystemTrayNotifier::NotifyScreenCaptureStart,
-      base::Unretained(WmShell::Get()->system_tray_notifier()),
+      base::Unretained(Shell::Get()->system_tray_notifier()),
       base::Bind(&ScreenTrayItemTest::StopCallback, base::Unretained(this)),
       base::UTF8ToUTF16(kTestScreenCaptureAppName));
 
   base::Closure stop_function =
       base::Bind(&SystemTrayNotifier::NotifyScreenCaptureStop,
-                 base::Unretained(WmShell::Get()->system_tray_notifier()));
+                 base::Unretained(Shell::Get()->system_tray_notifier()));
 
   TestNotificationStartAndStop(this, start_function, stop_function);
 }
@@ -157,13 +157,13 @@
 TEST_F(ScreenShareTest, NotificationStartAndStop) {
   base::Closure start_func = base::Bind(
       &SystemTrayNotifier::NotifyScreenShareStart,
-      base::Unretained(WmShell::Get()->system_tray_notifier()),
+      base::Unretained(Shell::Get()->system_tray_notifier()),
       base::Bind(&ScreenTrayItemTest::StopCallback, base::Unretained(this)),
       base::UTF8ToUTF16(kTestScreenShareHelperName));
 
   base::Closure stop_func =
       base::Bind(&SystemTrayNotifier::NotifyScreenShareStop,
-                 base::Unretained(WmShell::Get()->system_tray_notifier()));
+                 base::Unretained(Shell::Get()->system_tray_notifier()));
 
   TestNotificationStartAndStop(this, start_func, stop_func);
 }
diff --git a/ash/common/system/chromeos/session/logout_button_tray.cc b/ash/common/system/chromeos/session/logout_button_tray.cc
index 25bf462..2994b47 100644
--- a/ash/common/system/chromeos/session/logout_button_tray.cc
+++ b/ash/common/system/chromeos/session/logout_button_tray.cc
@@ -14,7 +14,6 @@
 #include "ash/common/system/tray/tray_constants.h"
 #include "ash/common/system/tray/tray_utils.h"
 #include "ash/common/system/user/login_status.h"
-#include "ash/common/wm_shell.h"
 #include "ash/public/cpp/shelf_types.h"
 #include "ash/resources/grit/ash_resources.h"
 #include "ash/resources/vector_icons/vector_icons.h"
@@ -53,11 +52,11 @@
   // by itself, no separator is needed on its right side.
   set_separator_visibility(false);
   tray_container()->AddChildView(button_);
-  WmShell::Get()->system_tray_notifier()->AddLogoutButtonObserver(this);
+  Shell::Get()->system_tray_notifier()->AddLogoutButtonObserver(this);
 }
 
 LogoutButtonTray::~LogoutButtonTray() {
-  WmShell::Get()->system_tray_notifier()->RemoveLogoutButtonObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveLogoutButtonObserver(this);
 }
 
 void LogoutButtonTray::SetShelfAlignment(ShelfAlignment alignment) {
diff --git a/ash/common/system/chromeos/session/logout_confirmation_controller.cc b/ash/common/system/chromeos/session/logout_confirmation_controller.cc
index 68433aff..e93d6ac 100644
--- a/ash/common/system/chromeos/session/logout_confirmation_controller.cc
+++ b/ash/common/system/chromeos/session/logout_confirmation_controller.cc
@@ -10,7 +10,6 @@
 #include "ash/common/system/chromeos/session/logout_confirmation_dialog.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "base/location.h"
 #include "base/time/default_tick_clock.h"
@@ -28,17 +27,16 @@
       logout_closure_(logout_closure),
       dialog_(NULL),
       logout_timer_(false, false) {
-  if (WmShell::HasInstance()) {
+  if (Shell::HasInstance()) {
     Shell::GetInstance()->AddShellObserver(this);
-    WmShell::Get()->system_tray_notifier()->AddLastWindowClosedObserver(this);
+    Shell::Get()->system_tray_notifier()->AddLastWindowClosedObserver(this);
   }
 }
 
 LogoutConfirmationController::~LogoutConfirmationController() {
-  if (WmShell::HasInstance()) {
+  if (Shell::HasInstance()) {
     Shell::GetInstance()->RemoveShellObserver(this);
-    WmShell::Get()->system_tray_notifier()->RemoveLastWindowClosedObserver(
-        this);
+    Shell::Get()->system_tray_notifier()->RemoveLastWindowClosedObserver(this);
   }
   if (dialog_)
     dialog_->ControllerGone();
@@ -55,7 +53,7 @@
 
   if (!dialog_) {
     // Show confirmation dialog unless this is a unit test without a Shell.
-    if (WmShell::HasInstance())
+    if (Shell::HasInstance())
       dialog_ = new LogoutConfirmationDialog(this, logout_time_);
   } else {
     dialog_->Update(logout_time_);
diff --git a/ash/common/system/chromeos/session/tray_session_length_limit.cc b/ash/common/system/chromeos/session/tray_session_length_limit.cc
index 7c1025e..7a6829a 100644
--- a/ash/common/system/chromeos/session/tray_session_length_limit.cc
+++ b/ash/common/system/chromeos/session/tray_session_length_limit.cc
@@ -13,7 +13,6 @@
 #include "ash/common/system/tray/system_tray.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
 #include "ash/resources/grit/ash_resources.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
@@ -49,13 +48,12 @@
       limit_state_(LIMIT_NONE),
       last_limit_state_(LIMIT_NONE),
       tray_bubble_view_(NULL) {
-  WmShell::Get()->system_tray_notifier()->AddSessionLengthLimitObserver(this);
+  Shell::Get()->system_tray_notifier()->AddSessionLengthLimitObserver(this);
   Update();
 }
 
 TraySessionLengthLimit::~TraySessionLengthLimit() {
-  WmShell::Get()->system_tray_notifier()->RemoveSessionLengthLimitObserver(
-      this);
+  Shell::Get()->system_tray_notifier()->RemoveSessionLengthLimitObserver(this);
 }
 
 // Add view to tray bubble.
diff --git a/ash/common/system/chromeos/system_clock_observer.cc b/ash/common/system/chromeos/system_clock_observer.cc
index 984c6ca..d369083 100644
--- a/ash/common/system/chromeos/system_clock_observer.cc
+++ b/ash/common/system/chromeos/system_clock_observer.cc
@@ -5,7 +5,7 @@
 #include "ash/common/system/chromeos/system_clock_observer.h"
 
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 
 namespace ash {
@@ -24,17 +24,17 @@
 }
 
 void SystemClockObserver::SystemClockUpdated() {
-  WmShell::Get()->system_tray_notifier()->NotifySystemClockTimeUpdated();
+  Shell::Get()->system_tray_notifier()->NotifySystemClockTimeUpdated();
 }
 
 void SystemClockObserver::SystemClockCanSetTimeChanged(bool can_set_time) {
   can_set_time_ = can_set_time;
-  WmShell::Get()->system_tray_notifier()->NotifySystemClockCanSetTimeChanged(
+  Shell::Get()->system_tray_notifier()->NotifySystemClockCanSetTimeChanged(
       can_set_time_);
 }
 
 void SystemClockObserver::TimezoneChanged(const icu::TimeZone& timezone) {
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshClock();
+  Shell::Get()->system_tray_notifier()->NotifyRefreshClock();
 }
 
 }  // namespace ash
diff --git a/ash/common/system/chromeos/tray_tracing.cc b/ash/common/system/chromeos/tray_tracing.cc
index 9d4b4bb..df89e0d 100644
--- a/ash/common/system/chromeos/tray_tracing.cc
+++ b/ash/common/system/chromeos/tray_tracing.cc
@@ -75,11 +75,11 @@
     : TrayImageItem(system_tray, kSystemTrayTracingIcon, UMA_TRACING),
       default_(nullptr) {
   DCHECK(system_tray);
-  WmShell::Get()->system_tray_notifier()->AddTracingObserver(this);
+  Shell::Get()->system_tray_notifier()->AddTracingObserver(this);
 }
 
 TrayTracing::~TrayTracing() {
-  WmShell::Get()->system_tray_notifier()->RemoveTracingObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveTracingObserver(this);
 }
 
 void TrayTracing::SetTrayIconVisible(bool visible) {
diff --git a/ash/common/system/date/date_default_view.cc b/ash/common/system/date/date_default_view.cc
index 0ff3026..73a97258 100644
--- a/ash/common/system/date/date_default_view.cc
+++ b/ash/common/system/date/date_default_view.cc
@@ -89,7 +89,7 @@
     view->AddViewToRowNonMd(shutdown_button_, true);
     // This object is recreated every time the menu opens. Don't bother updating
     // the tooltip if the shutdown policy changes while the menu is open.
-    bool reboot = WmShell::Get()->shutdown_controller()->reboot_on_shutdown();
+    bool reboot = Shell::Get()->shutdown_controller()->reboot_on_shutdown();
     shutdown_button_->SetTooltipText(l10n_util::GetStringUTF16(
         reboot ? IDS_ASH_STATUS_TRAY_REBOOT : IDS_ASH_STATUS_TRAY_SHUTDOWN));
   }
diff --git a/ash/common/system/date/tray_date.cc b/ash/common/system/date/tray_date.cc
index 2ba6d6d2..75bccee 100644
--- a/ash/common/system/date/tray_date.cc
+++ b/ash/common/system/date/tray_date.cc
@@ -11,7 +11,7 @@
 #include "ash/common/system/tray/system_tray.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/system/tray/tray_item_view.h"
-#include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 
 namespace ash {
 
@@ -21,11 +21,11 @@
       default_view_(NULL),
       login_status_(LoginStatus::NOT_LOGGED_IN),
       system_clock_observer_(new SystemClockObserver()) {
-  WmShell::Get()->system_tray_notifier()->AddClockObserver(this);
+  Shell::Get()->system_tray_notifier()->AddClockObserver(this);
 }
 
 TrayDate::~TrayDate() {
-  WmShell::Get()->system_tray_notifier()->RemoveClockObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveClockObserver(this);
 }
 
 views::View* TrayDate::GetHelpButtonView() const {
diff --git a/ash/common/system/date/tray_system_info.cc b/ash/common/system/date/tray_system_info.cc
index aad34ff..43459977 100644
--- a/ash/common/system/date/tray_system_info.cc
+++ b/ash/common/system/date/tray_system_info.cc
@@ -11,7 +11,7 @@
 #include "ash/common/system/tray/system_tray.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/system/tray/tray_item_view.h"
-#include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 
 namespace ash {
 
@@ -21,11 +21,11 @@
       default_view_(nullptr),
       login_status_(LoginStatus::NOT_LOGGED_IN),
       system_clock_observer_(new SystemClockObserver()) {
-  WmShell::Get()->system_tray_notifier()->AddClockObserver(this);
+  Shell::Get()->system_tray_notifier()->AddClockObserver(this);
 }
 
 TraySystemInfo::~TraySystemInfo() {
-  WmShell::Get()->system_tray_notifier()->RemoveClockObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveClockObserver(this);
 }
 
 const tray::TimeView* TraySystemInfo::GetTimeTrayForTesting() const {
diff --git a/ash/common/system/ime/tray_ime_chromeos.cc b/ash/common/system/ime/tray_ime_chromeos.cc
index b08ce3fc..364cfc9 100644
--- a/ash/common/system/ime/tray_ime_chromeos.cc
+++ b/ash/common/system/ime/tray_ime_chromeos.cc
@@ -220,14 +220,14 @@
       detailed_(NULL),
       keyboard_suppressed_(false),
       is_visible_(true) {
-  SystemTrayNotifier* tray_notifier = WmShell::Get()->system_tray_notifier();
+  SystemTrayNotifier* tray_notifier = Shell::Get()->system_tray_notifier();
   tray_notifier->AddVirtualKeyboardObserver(this);
   tray_notifier->AddAccessibilityObserver(this);
   tray_notifier->AddIMEObserver(this);
 }
 
 TrayIME::~TrayIME() {
-  SystemTrayNotifier* tray_notifier = WmShell::Get()->system_tray_notifier();
+  SystemTrayNotifier* tray_notifier = Shell::Get()->system_tray_notifier();
   tray_notifier->RemoveIMEObserver(this);
   tray_notifier->RemoveAccessibilityObserver(this);
   tray_notifier->RemoveVirtualKeyboardObserver(this);
diff --git a/ash/common/system/ime/tray_ime_chromeos_unittest.cc b/ash/common/system/ime/tray_ime_chromeos_unittest.cc
index 7db95ae1..8530e4f 100644
--- a/ash/common/system/ime/tray_ime_chromeos_unittest.cc
+++ b/ash/common/system/ime/tray_ime_chromeos_unittest.cc
@@ -65,7 +65,7 @@
   keyboard::SetAccessibilityKeyboardEnabled(enabled);
   AccessibilityNotificationVisibility notification =
       enabled ? A11Y_NOTIFICATION_SHOW : A11Y_NOTIFICATION_NONE;
-  WmShell::Get()->system_tray_notifier()->NotifyAccessibilityModeChanged(
+  Shell::Get()->system_tray_notifier()->NotifyAccessibilityModeChanged(
       notification);
 }
 
diff --git a/ash/common/system/overview/overview_button_tray.cc b/ash/common/system/overview/overview_button_tray.cc
index d642efe8..8eaeaf8a 100644
--- a/ash/common/system/overview/overview_button_tray.cc
+++ b/ash/common/system/overview/overview_button_tray.cc
@@ -48,7 +48,7 @@
 
 bool OverviewButtonTray::PerformAction(const ui::Event& event) {
   WindowSelectorController* controller =
-      WmShell::Get()->window_selector_controller();
+      Shell::Get()->window_selector_controller();
   // Toggling overview mode will fail if there is no window to show.
   bool performed = controller->ToggleOverview();
   WmShell::Get()->RecordUserMetricsAction(UMA_TRAY_OVERVIEW);
diff --git a/ash/common/system/tiles/tiles_default_view.cc b/ash/common/system/tiles/tiles_default_view.cc
index 5861a99..1e3ebed 100644
--- a/ash/common/system/tiles/tiles_default_view.cc
+++ b/ash/common/system/tiles/tiles_default_view.cc
@@ -49,7 +49,6 @@
 TilesDefaultView::~TilesDefaultView() {}
 
 void TilesDefaultView::Init() {
-  WmShell* shell = WmShell::Get();
   views::BoxLayout* box_layout =
       new views::BoxLayout(views::BoxLayout::kHorizontal, 4, 0, 0);
   box_layout->set_main_axis_alignment(
@@ -102,7 +101,7 @@
   AddChildView(power_button_);
   // This object is recreated every time the menu opens. Don't bother updating
   // the tooltip if the shutdown policy changes while the menu is open.
-  bool reboot = shell->shutdown_controller()->reboot_on_shutdown();
+  bool reboot = Shell::Get()->shutdown_controller()->reboot_on_shutdown();
   power_button_->SetTooltipText(l10n_util::GetStringUTF16(
       reboot ? IDS_ASH_STATUS_TRAY_REBOOT : IDS_ASH_STATUS_TRAY_SHUTDOWN));
 }
diff --git a/ash/common/system/tray/system_tray_controller.cc b/ash/common/system/tray/system_tray_controller.cc
index 547ac99..756c7e8b 100644
--- a/ash/common/system/tray/system_tray_controller.cc
+++ b/ash/common/system/tray/system_tray_controller.cc
@@ -10,6 +10,7 @@
 #include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
 #include "ash/root_window_controller.h"
+#include "ash/shell.h"
 
 namespace ash {
 
@@ -179,7 +180,7 @@
 
 void SystemTrayController::SetUse24HourClock(bool use_24_hour) {
   hour_clock_type_ = use_24_hour ? base::k24HourClock : base::k12HourClock;
-  WmShell::Get()->system_tray_notifier()->NotifyDateFormatChanged();
+  Shell::Get()->system_tray_notifier()->NotifyDateFormatChanged();
 }
 
 void SystemTrayController::ShowUpdateIcon(mojom::UpdateSeverity severity,
diff --git a/ash/common/system/tray_accessibility.cc b/ash/common/system/tray_accessibility.cc
index 2e79edee..7523dfe2 100644
--- a/ash/common/system/tray_accessibility.cc
+++ b/ash/common/system/tray_accessibility.cc
@@ -334,11 +334,11 @@
       previous_accessibility_state_(GetAccessibilityState()),
       show_a11y_menu_on_lock_screen_(true) {
   DCHECK(system_tray);
-  WmShell::Get()->system_tray_notifier()->AddAccessibilityObserver(this);
+  Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(this);
 }
 
 TrayAccessibility::~TrayAccessibility() {
-  WmShell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(this);
 }
 
 void TrayAccessibility::SetTrayIconVisible(bool visible) {
diff --git a/ash/common/system/user/tray_user.cc b/ash/common/system/user/tray_user.cc
index c9035d3..b586fe9 100644
--- a/ash/common/system/user/tray_user.cc
+++ b/ash/common/system/user/tray_user.cc
@@ -44,11 +44,11 @@
       layout_view_(nullptr),
       avatar_(nullptr),
       label_(nullptr) {
-  WmShell::Get()->system_tray_notifier()->AddUserObserver(this);
+  Shell::Get()->system_tray_notifier()->AddUserObserver(this);
 }
 
 TrayUser::~TrayUser() {
-  WmShell::Get()->system_tray_notifier()->RemoveUserObserver(this);
+  Shell::Get()->system_tray_notifier()->RemoveUserObserver(this);
 }
 
 TrayUser::TestState TrayUser::GetStateForTest() const {
diff --git a/ash/common/wallpaper/wallpaper_view.cc b/ash/common/wallpaper/wallpaper_view.cc
index 843f95a..8fedb4a 100644
--- a/ash/common/wallpaper/wallpaper_view.cc
+++ b/ash/common/wallpaper/wallpaper_view.cc
@@ -85,7 +85,7 @@
   void OnMouseEvent(ui::MouseEvent* event) override {
     CHECK_EQ(ui::EP_PRETARGET, event->phase());
     WindowSelectorController* controller =
-        WmShell::Get()->window_selector_controller();
+        Shell::Get()->window_selector_controller();
     if (event->type() == ui::ET_MOUSE_RELEASED && controller->IsSelecting()) {
       controller->ToggleOverview();
       event->StopPropagation();
@@ -95,7 +95,7 @@
   void OnGestureEvent(ui::GestureEvent* event) override {
     CHECK_EQ(ui::EP_PRETARGET, event->phase());
     WindowSelectorController* controller =
-        WmShell::Get()->window_selector_controller();
+        Shell::Get()->window_selector_controller();
     if (event->type() == ui::ET_GESTURE_TAP && controller->IsSelecting()) {
       controller->ToggleOverview();
       event->StopPropagation();
diff --git a/ash/common/wm/maximize_mode/maximize_mode_window_manager.cc b/ash/common/wm/maximize_mode/maximize_mode_window_manager.cc
index fbaaaf2..d4a3e88 100644
--- a/ash/common/wm/maximize_mode/maximize_mode_window_manager.cc
+++ b/ash/common/wm/maximize_mode/maximize_mode_window_manager.cc
@@ -33,7 +33,7 @@
 // Exits overview mode if it is currently active.
 void CancelOverview() {
   WindowSelectorController* controller =
-      WmShell::Get()->window_selector_controller();
+      Shell::Get()->window_selector_controller();
   if (controller->IsSelecting())
     controller->OnSelectionEnded();
 }
diff --git a/ash/common/wm/panels/panel_layout_manager.cc b/ash/common/wm/panels/panel_layout_manager.cc
index cd016d6..ac8f2a9 100644
--- a/ash/common/wm/panels/panel_layout_manager.cc
+++ b/ash/common/wm/panels/panel_layout_manager.cc
@@ -258,9 +258,8 @@
       keyboard_observer_(this),
       weak_factory_(this) {
   DCHECK(panel_container);
-  WmShell* shell = panel_container->GetShell();
   Shell::GetInstance()->activation_client()->AddObserver(this);
-  shell->AddDisplayObserver(this);
+  WmShell::Get()->AddDisplayObserver(this);
   Shell::GetInstance()->AddShellObserver(this);
 }
 
@@ -616,7 +615,7 @@
   // when the WindowSelectorController is restoring minimized windows so that
   // they actually become visible.
   WindowSelectorController* window_selector_controller =
-      WmShell::Get()->window_selector_controller();
+      Shell::Get()->window_selector_controller();
   if (in_layout_ ||
       (window_selector_controller->IsSelecting() &&
        !window_selector_controller->IsRestoringMinimizedWindows())) {
diff --git a/ash/common/wm/window_cycle_list.cc b/ash/common/wm/window_cycle_list.cc
index 9f9a110..f70abf0 100644
--- a/ash/common/wm/window_cycle_list.cc
+++ b/ash/common/wm/window_cycle_list.cc
@@ -9,7 +9,6 @@
 
 #include "ash/common/wm/mru_window_tracker.h"
 #include "ash/common/wm/window_state.h"
-#include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
@@ -489,7 +488,7 @@
                                          new_target_window);
     if (windows_.empty()) {
       // This deletes us.
-      WmShell::Get()->window_cycle_controller()->CancelCycling();
+      Shell::Get()->window_cycle_controller()->CancelCycling();
       return;
     }
   }
@@ -507,7 +506,7 @@
               ->GetDisplayNearestWindow(cycle_ui_widget_->GetNativeView())
               .id() &&
       (changed_metrics & (DISPLAY_METRIC_BOUNDS | DISPLAY_METRIC_ROTATION))) {
-    WmShell::Get()->window_cycle_controller()->CancelCycling();
+    Shell::Get()->window_cycle_controller()->CancelCycling();
     // |this| is deleted.
     return;
   }
diff --git a/ash/common/wm_shell.cc b/ash/common/wm_shell.cc
index a74f177..6119713 100644
--- a/ash/common/wm_shell.cc
+++ b/ash/common/wm_shell.cc
@@ -11,13 +11,8 @@
 #include "ash/common/session/session_state_delegate.h"
 #include "ash/common/shelf/app_list_shelf_item_delegate.h"
 #include "ash/common/shell_delegate.h"
-#include "ash/common/shutdown_controller.h"
-#include "ash/common/system/chromeos/network/vpn_list.h"
-#include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm/overview/window_selector_controller.h"
 #include "ash/common/wm/root_window_finder.h"
 #include "ash/common/wm/system_modal_container_layout_manager.h"
-#include "ash/common/wm/window_cycle_controller.h"
 #include "ash/common/wm_window.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
@@ -71,13 +66,7 @@
   lock_state_observers_.RemoveObserver(observer);
 }
 
-WmShell::WmShell()
-    : shutdown_controller_(base::MakeUnique<ShutdownController>()),
-      system_tray_notifier_(base::MakeUnique<SystemTrayNotifier>()),
-      vpn_list_(base::MakeUnique<VpnList>()),
-      window_cycle_controller_(base::MakeUnique<WindowCycleController>()),
-      window_selector_controller_(
-          base::MakeUnique<WindowSelectorController>()) {
+WmShell::WmShell() {
   DCHECK(!instance_);
   instance_ = this;
 }
@@ -134,12 +123,4 @@
   }
 }
 
-void WmShell::DeleteWindowCycleController() {
-  window_cycle_controller_.reset();
-}
-
-void WmShell::DeleteWindowSelectorController() {
-  window_selector_controller_.reset();
-}
-
 }  // namespace ash
diff --git a/ash/common/wm_shell.h b/ash/common/wm_shell.h
index c5a7ad23..c930a90 100644
--- a/ash/common/wm_shell.h
+++ b/ash/common/wm_shell.h
@@ -44,13 +44,8 @@
 class ScopedDisableInternalMouseAndKeyboard;
 class SessionStateDelegate;
 struct ShellInitParams;
-class ShutdownController;
-class SystemTrayNotifier;
-class VpnList;
-class WindowCycleController;
 class WindowCycleEventFilter;
 class WindowResizer;
-class WindowSelectorController;
 class WmDisplayObserver;
 class WmWindow;
 class WorkspaceEventHandler;
@@ -73,24 +68,6 @@
 
   virtual void Shutdown();
 
-  ShutdownController* shutdown_controller() {
-    return shutdown_controller_.get();
-  }
-
-  SystemTrayNotifier* system_tray_notifier() {
-    return system_tray_notifier_.get();
-  }
-
-  VpnList* vpn_list() { return vpn_list_.get(); }
-
-  WindowCycleController* window_cycle_controller() {
-    return window_cycle_controller_.get();
-  }
-
-  WindowSelectorController* window_selector_controller() {
-    return window_selector_controller_.get();
-  }
-
   // Returns true when ash is running as a service_manager::Service.
   virtual bool IsRunningInMash() const = 0;
 
@@ -255,22 +232,12 @@
   virtual std::unique_ptr<AcceleratorController>
   CreateAcceleratorController() = 0;
 
-  void DeleteWindowCycleController();
-
-  void DeleteWindowSelectorController();
-
  private:
   friend class AcceleratorControllerTest;
   friend class Shell;
 
   static WmShell* instance_;
 
-  std::unique_ptr<ShutdownController> shutdown_controller_;
-  std::unique_ptr<SystemTrayNotifier> system_tray_notifier_;
-  std::unique_ptr<VpnList> vpn_list_;
-  std::unique_ptr<WindowCycleController> window_cycle_controller_;
-  std::unique_ptr<WindowSelectorController> window_selector_controller_;
-
   base::ObserverList<LockStateObserver> lock_state_observers_;
 
   bool simulate_modal_window_open_for_testing_ = false;
diff --git a/ash/rotator/screen_rotation_animator.cc b/ash/rotator/screen_rotation_animator.cc
index c0dbe20..102b8d0 100644
--- a/ash/rotator/screen_rotation_animator.cc
+++ b/ash/rotator/screen_rotation_animator.cc
@@ -14,9 +14,11 @@
 #include "ash/shell.h"
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
 #include "ui/aura/window.h"
 #include "ui/compositor/layer.h"
+#include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/layer_animator.h"
@@ -143,7 +145,7 @@
 void LayerCleanupObserver::OnLayerAnimationEnded(
     ui::LayerAnimationSequence* sequence) {
   if (animator_)
-    animator_->OnLayerAnimationEnded();
+    animator_->ProcessAnimationQueue();
 
   delete this;
 }
@@ -151,7 +153,7 @@
 void LayerCleanupObserver::OnLayerAnimationAborted(
     ui::LayerAnimationSequence* sequence) {
   if (animator_)
-    animator_->OnLayerAnimationAborted();
+    animator_->ProcessAnimationQueue();
 
   delete this;
 }
@@ -167,6 +169,20 @@
   sequence_ = nullptr;
 }
 
+class ScreenRotationAnimationMetricsReporter
+    : public ui::AnimationMetricsReporter {
+ public:
+  ScreenRotationAnimationMetricsReporter() {}
+  ~ScreenRotationAnimationMetricsReporter() override {}
+
+  void Report(int value) override {
+    UMA_HISTOGRAM_PERCENTAGE("Ash.Rotation.AnimationSmoothness", value);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ScreenRotationAnimationMetricsReporter);
+};
+
 }  // namespace
 
 struct ScreenRotationAnimator::ScreenRotationRequest {
@@ -180,10 +196,22 @@
 ScreenRotationAnimator::ScreenRotationAnimator(int64_t display_id)
     : display_id_(display_id),
       is_rotating_(false),
+      metrics_reporter_(
+          base::MakeUnique<ScreenRotationAnimationMetricsReporter>()),
       disable_animation_timers_for_test_(false),
       weak_factory_(this) {}
 
-ScreenRotationAnimator::~ScreenRotationAnimator() {}
+ScreenRotationAnimator::~ScreenRotationAnimator() {
+  // To prevent a call to |LayerCleanupObserver::OnLayerAnimationAborted()| from
+  // calling a method on the |animator_|.
+  weak_factory_.InvalidateWeakPtrs();
+
+  // Explicitly reset the |old_layer_tree_owner_| and |metrics_reporter_| in
+  // order to make sure |metrics_reporter_| outlives the attached animation
+  // sequence.
+  old_layer_tree_owner_.reset();
+  metrics_reporter_.reset();
+}
 
 void ScreenRotationAnimator::AnimateRotation(
     std::unique_ptr<ScreenRotationRequest> rotation_request) {
@@ -278,6 +306,7 @@
   // control the animation.
   if (disable_animation_timers_for_test_)
     animator->set_disable_timer_for_test(true);
+  animation_sequence->SetAnimationMetricsReporter(metrics_reporter_.get());
   animator->StartAnimation(animation_sequence.release());
 
   rotation_request.reset();
@@ -313,15 +342,6 @@
   screen_rotation_animator_observers_.RemoveObserver(observer);
 }
 
-void ScreenRotationAnimator::OnLayerAnimationEnded() {
-  ProcessAnimationQueue();
-}
-
-void ScreenRotationAnimator::OnLayerAnimationAborted() {
-  AbortAnimations(old_layer_tree_owner_->root());
-  ProcessAnimationQueue();
-}
-
 void ScreenRotationAnimator::ProcessAnimationQueue() {
   is_rotating_ = false;
   old_layer_tree_owner_.reset();
diff --git a/ash/rotator/screen_rotation_animator.h b/ash/rotator/screen_rotation_animator.h
index ac6f18a..b541106 100644
--- a/ash/rotator/screen_rotation_animator.h
+++ b/ash/rotator/screen_rotation_animator.h
@@ -14,6 +14,7 @@
 #include "ui/display/display.h"
 
 namespace ui {
+class AnimationMetricsReporter;
 class Layer;
 class LayerTreeOwner;
 }  // namespace ui
@@ -49,9 +50,10 @@
   void RemoveScreenRotationAnimatorObserver(
       ScreenRotationAnimatorObserver* observer);
 
-  void OnLayerAnimationEnded();
-
-  void OnLayerAnimationAborted();
+  // When screen rotation animation is ended or aborted, calls |Rotate()| with
+  // the pending rotation request if the request queue is not empty. Otherwise
+  // notifies |screen_rotation_animator_observer_|.
+  void ProcessAnimationQueue();
 
  private:
   friend class ash::test::ScreenRotationAnimatorTestApi;
@@ -64,11 +66,6 @@
   // |rotation_degrees| arc.
   void AnimateRotation(std::unique_ptr<ScreenRotationRequest> rotation_request);
 
-  // When screen rotation animation is ended or aborted, if the request queue is
-  // not empty, it will call |Rotate()| with the pending rotation request.
-  // Otherwise it will notify |screen_rotation_animator_observer_|.
-  void ProcessAnimationQueue();
-
   void set_disable_animation_timers_for_test(bool disable_timers);
 
   void StopAnimating();
@@ -76,6 +73,7 @@
   // The id of the display to rotate.
   int64_t display_id_;
   bool is_rotating_;
+  std::unique_ptr<ui::AnimationMetricsReporter> metrics_reporter_;
   // Only set in unittest to disable animation timers.
   bool disable_animation_timers_for_test_;
   base::ObserverList<ScreenRotationAnimatorObserver>
diff --git a/ash/shell.cc b/ash/shell.cc
index b0802141..5cd341611 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -38,12 +38,14 @@
 #include "ash/common/shelf/wm_shelf.h"
 #include "ash/common/shell_delegate.h"
 #include "ash/common/shell_observer.h"
+#include "ash/common/shutdown_controller.h"
 #include "ash/common/system/brightness_control_delegate.h"
 #include "ash/common/system/chromeos/bluetooth/bluetooth_notification_controller.h"
 #include "ash/common/system/chromeos/bluetooth/tray_bluetooth_helper.h"
 #include "ash/common/system/chromeos/brightness/brightness_controller_chromeos.h"
 #include "ash/common/system/chromeos/keyboard_brightness_controller.h"
 #include "ash/common/system/chromeos/network/sms_observer.h"
+#include "ash/common/system/chromeos/network/vpn_list.h"
 #include "ash/common/system/chromeos/power/power_status.h"
 #include "ash/common/system/chromeos/session/logout_confirmation_controller.h"
 #include "ash/common/system/keyboard_brightness_control_delegate.h"
@@ -60,8 +62,10 @@
 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
 #include "ash/common/wm/maximize_mode/maximize_mode_window_manager.h"
 #include "ash/common/wm/mru_window_tracker.h"
+#include "ash/common/wm/overview/window_selector_controller.h"
 #include "ash/common/wm/root_window_finder.h"
 #include "ash/common/wm/system_modal_container_layout_manager.h"
+#include "ash/common/wm/window_cycle_controller.h"
 #include "ash/common/wm/window_positioner.h"
 #include "ash/common/wm/workspace_controller.h"
 #include "ash/common/wm_shell.h"
@@ -559,7 +563,12 @@
       session_controller_(base::MakeUnique<SessionController>()),
       shelf_controller_(base::MakeUnique<ShelfController>()),
       shell_delegate_(std::move(shell_delegate)),
+      shutdown_controller_(base::MakeUnique<ShutdownController>()),
       system_tray_controller_(base::MakeUnique<SystemTrayController>()),
+      system_tray_notifier_(base::MakeUnique<SystemTrayNotifier>()),
+      vpn_list_(base::MakeUnique<VpnList>()),
+      window_cycle_controller_(base::MakeUnique<WindowCycleController>()),
+      window_selector_controller_(base::MakeUnique<WindowSelectorController>()),
       app_list_(base::MakeUnique<app_list::AppList>()),
       link_handler_model_factory_(nullptr),
       tray_bluetooth_helper_(base::MakeUnique<TrayBluetoothHelper>()),
@@ -667,8 +676,8 @@
   resize_shadow_controller_.reset();
 
   // Has to happen before ~MruWindowTracker.
-  wm_shell_->DeleteWindowCycleController();
-  wm_shell_->DeleteWindowSelectorController();
+  window_cycle_controller_.reset();
+  window_selector_controller_.reset();
 
   CloseAllRootWindowChildWindows();
 
@@ -960,7 +969,7 @@
   }
 
   lock_state_controller_ =
-      base::MakeUnique<LockStateController>(wm_shell_->shutdown_controller());
+      base::MakeUnique<LockStateController>(shutdown_controller_.get());
   power_button_controller_.reset(
       new PowerButtonController(lock_state_controller_.get()));
   // Pass the initial display state to PowerButtonController.
diff --git a/ash/shell.h b/ash/shell.h
index 343af630..8da1f6a 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -148,6 +148,7 @@
 class ShellDelegate;
 struct ShellInitParams;
 class ShellObserver;
+class ShutdownController;
 class ShutdownObserver;
 class SmsObserver;
 class StickyKeysController;
@@ -156,16 +157,20 @@
 class SystemTray;
 class SystemTrayController;
 class SystemTrayDelegate;
+class SystemTrayNotifier;
 class ToplevelWindowEventHandler;
 class ToastManager;
 class TrayBluetoothHelper;
 class VirtualKeyboardController;
 class VideoActivityNotifier;
 class VideoDetector;
+class VpnList;
 class WallpaperController;
 class WallpaperDelegate;
 class WebNotificationTray;
+class WindowCycleController;
 class WindowPositioner;
+class WindowSelectorController;
 class WindowTreeHostManager;
 class WmShell;
 class WmWindow;
@@ -337,15 +342,28 @@
   ShelfController* shelf_controller() { return shelf_controller_.get(); }
   ShelfDelegate* shelf_delegate() { return shelf_delegate_.get(); }
   ShelfModel* shelf_model();
+  ShutdownController* shutdown_controller() {
+    return shutdown_controller_.get();
+  }
   SystemTrayController* system_tray_controller() {
     return system_tray_controller_.get();
   }
   SystemTrayDelegate* system_tray_delegate() {
     return system_tray_delegate_.get();
   }
+  SystemTrayNotifier* system_tray_notifier() {
+    return system_tray_notifier_.get();
+  }
   views::corewm::TooltipController* tooltip_controller() {
     return tooltip_controller_.get();
   }
+  VpnList* vpn_list() { return vpn_list_.get(); }
+  WindowCycleController* window_cycle_controller() {
+    return window_cycle_controller_.get();
+  }
+  WindowSelectorController* window_selector_controller() {
+    return window_selector_controller_.get();
+  }
   OverlayEventFilter* overlay_filter() { return overlay_filter_.get(); }
   LinkHandlerModelFactory* link_handler_model_factory() {
     return link_handler_model_factory_;
@@ -669,11 +687,16 @@
   std::unique_ptr<ShelfDelegate> shelf_delegate_;
   std::unique_ptr<ShelfWindowWatcher> shelf_window_watcher_;
   std::unique_ptr<ShellDelegate> shell_delegate_;
+  std::unique_ptr<ShutdownController> shutdown_controller_;
   std::unique_ptr<SystemTrayController> system_tray_controller_;
   std::unique_ptr<SystemTrayDelegate> system_tray_delegate_;
+  std::unique_ptr<SystemTrayNotifier> system_tray_notifier_;
   std::unique_ptr<ToastManager> toast_manager_;
+  std::unique_ptr<VpnList> vpn_list_;
   std::unique_ptr<WallpaperController> wallpaper_controller_;
   std::unique_ptr<WallpaperDelegate> wallpaper_delegate_;
+  std::unique_ptr<WindowCycleController> window_cycle_controller_;
+  std::unique_ptr<WindowSelectorController> window_selector_controller_;
   std::unique_ptr<::wm::ShadowController> shadow_controller_;
   std::unique_ptr<::wm::VisibilityController> visibility_controller_;
   std::unique_ptr<::wm::WindowModalityController> window_modality_controller_;
diff --git a/ash/system/chromeos/power/power_event_observer.cc b/ash/system/chromeos/power/power_event_observer.cc
index 88454e0..b18e340f 100644
--- a/ash/system/chromeos/power/power_event_observer.cc
+++ b/ash/system/chromeos/power/power_event_observer.cc
@@ -134,7 +134,7 @@
   // here: http://crbug.com/692193
   if (!WmShell::Get()->IsRunningInMash())
     Shell::GetInstance()->display_configurator()->ResumeDisplays();
-  WmShell::Get()->system_tray_notifier()->NotifyRefreshClock();
+  Shell::Get()->system_tray_notifier()->NotifyRefreshClock();
 
   // If the suspend request was being blocked while waiting for the lock
   // animation to complete, clear the blocker since the suspend has already
diff --git a/ash/system/overview/overview_button_tray_unittest.cc b/ash/system/overview/overview_button_tray_unittest.cc
index 51ab690..fbd5bae 100644
--- a/ash/system/overview/overview_button_tray_unittest.cc
+++ b/ash/system/overview/overview_button_tray_unittest.cc
@@ -98,7 +98,7 @@
 
 // Tests that activating this control brings up window selection mode.
 TEST_F(OverviewButtonTrayTest, PerformAction) {
-  ASSERT_FALSE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  ASSERT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
 
   // Overview Mode only works when there is a window
   std::unique_ptr<aura::Window> window(
@@ -106,7 +106,7 @@
   ui::GestureEvent tap(0, 0, 0, base::TimeTicks(),
                        ui::GestureEventDetails(ui::ET_GESTURE_TAP));
   GetTray()->PerformAction(tap);
-  EXPECT_TRUE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->IsSelecting());
 }
 
 // Tests that tapping on the control will record the user action Tray_Overview.
@@ -115,7 +115,7 @@
   if (WmShell::Get()->IsRunningInMash())
     return;
 
-  ASSERT_FALSE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  ASSERT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
 
   // Tapping on the control when there are no windows (and thus the user cannot
   // enter overview mode) should still record the action.
@@ -123,7 +123,7 @@
   ui::GestureEvent tap(0, 0, 0, base::TimeTicks(),
                        ui::GestureEventDetails(ui::ET_GESTURE_TAP));
   GetTray()->PerformAction(tap);
-  ASSERT_FALSE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  ASSERT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
   EXPECT_EQ(1, user_action_tester.GetActionCount(kTrayOverview));
 
   // With one window present, tapping on the control to enter overview mode
@@ -131,13 +131,13 @@
   std::unique_ptr<aura::Window> window(
       CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20)));
   GetTray()->PerformAction(tap);
-  ASSERT_TRUE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  ASSERT_TRUE(Shell::Get()->window_selector_controller()->IsSelecting());
   EXPECT_EQ(2, user_action_tester.GetActionCount(kTrayOverview));
 
   // Tapping on the control to exit overview mode should record the
   // user action.
   GetTray()->PerformAction(tap);
-  ASSERT_FALSE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  ASSERT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
   EXPECT_EQ(3, user_action_tester.GetActionCount(kTrayOverview));
 }
 
@@ -192,19 +192,19 @@
 // Tests that the tray only renders as active while selection is ongoing. Any
 // dismissal of overview mode clears the active state.
 TEST_F(OverviewButtonTrayTest, ActiveStateOnlyDuringOverviewMode) {
-  ASSERT_FALSE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  ASSERT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
   ASSERT_FALSE(GetTray()->is_active());
 
   // Overview Mode only works when there is a window
   std::unique_ptr<aura::Window> window(
       CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20)));
 
-  EXPECT_TRUE(WmShell::Get()->window_selector_controller()->ToggleOverview());
-  EXPECT_TRUE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->ToggleOverview());
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->IsSelecting());
   EXPECT_TRUE(GetTray()->is_active());
 
-  EXPECT_TRUE(WmShell::Get()->window_selector_controller()->ToggleOverview());
-  EXPECT_FALSE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->ToggleOverview());
+  EXPECT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
   EXPECT_FALSE(GetTray()->is_active());
 }
 
diff --git a/ash/virtual_keyboard_controller.cc b/ash/virtual_keyboard_controller.cc
index eb701562..ca7d78c 100644
--- a/ash/virtual_keyboard_controller.cc
+++ b/ash/virtual_keyboard_controller.cc
@@ -198,11 +198,9 @@
       has_internal_keyboard_ && !ignore_internal_keyboard;
   SetKeyboardEnabled(!is_internal_keyboard_active && has_touchscreen_ &&
                      (!has_external_keyboard_ || ignore_external_keyboard_));
-  WmShell::Get()
-      ->system_tray_notifier()
-      ->NotifyVirtualKeyboardSuppressionChanged(!is_internal_keyboard_active &&
-                                                has_touchscreen_ &&
-                                                has_external_keyboard_);
+  Shell::Get()->system_tray_notifier()->NotifyVirtualKeyboardSuppressionChanged(
+      !is_internal_keyboard_active && has_touchscreen_ &&
+      has_external_keyboard_);
 }
 
 void VirtualKeyboardController::SetKeyboardEnabled(bool enabled) {
diff --git a/ash/virtual_keyboard_controller_unittest.cc b/ash/virtual_keyboard_controller_unittest.cc
index 372354f..d66383f 100644
--- a/ash/virtual_keyboard_controller_unittest.cc
+++ b/ash/virtual_keyboard_controller_unittest.cc
@@ -11,7 +11,6 @@
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
 #include "ash/common/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "base/command_line.h"
@@ -116,11 +115,11 @@
     // with the test.
     UpdateKeyboardDevices(std::vector<ui::InputDevice>());
     UpdateTouchscreenDevices(std::vector<ui::TouchscreenDevice>());
-    WmShell::Get()->system_tray_notifier()->AddVirtualKeyboardObserver(this);
+    Shell::Get()->system_tray_notifier()->AddVirtualKeyboardObserver(this);
   }
 
   void TearDown() override {
-    WmShell::Get()->system_tray_notifier()->RemoveVirtualKeyboardObserver(this);
+    Shell::Get()->system_tray_notifier()->RemoveVirtualKeyboardObserver(this);
     AshTestBase::TearDown();
   }
 
diff --git a/ash/wm/gestures/overview_gesture_handler.cc b/ash/wm/gestures/overview_gesture_handler.cc
index 8d84fee..940d844 100644
--- a/ash/wm/gestures/overview_gesture_handler.cc
+++ b/ash/wm/gestures/overview_gesture_handler.cc
@@ -6,6 +6,7 @@
 
 #include "ash/common/wm/overview/window_selector_controller.h"
 #include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 #include "ui/events/event.h"
 #include "ui/events/event_constants.h"
 
@@ -33,7 +34,7 @@
   scroll_y_ += event.y_offset();
 
   WindowSelectorController* window_selector_controller =
-      WmShell::Get()->window_selector_controller();
+      Shell::Get()->window_selector_controller();
 
   // Horizontal 3-finger scroll moves selection when already in overview mode.
   if (std::fabs(scroll_x_) >= std::fabs(scroll_y_)) {
diff --git a/ash/wm/gestures/overview_gesture_handler_unittest.cc b/ash/wm/gestures/overview_gesture_handler_unittest.cc
index 90d2639..4346b4d7 100644
--- a/ash/wm/gestures/overview_gesture_handler_unittest.cc
+++ b/ash/wm/gestures/overview_gesture_handler_unittest.cc
@@ -5,7 +5,6 @@
 #include "ash/wm/gestures/overview_gesture_handler.h"
 
 #include "ash/common/wm/overview/window_selector_controller.h"
-#include "ash/common/wm_shell.h"
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -29,11 +28,11 @@
   }
 
   void ToggleOverview() {
-    WmShell::Get()->window_selector_controller()->ToggleOverview();
+    Shell::Get()->window_selector_controller()->ToggleOverview();
   }
 
   bool IsSelecting() {
-    return WmShell::Get()->window_selector_controller()->IsSelecting();
+    return Shell::Get()->window_selector_controller()->IsSelecting();
   }
 
   float vertical_threshold_pixels() const {
diff --git a/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc b/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc
index 759f53a..64c0357 100644
--- a/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc
+++ b/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc
@@ -12,7 +12,6 @@
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/test/test_system_tray_delegate.h"
 #include "ash/common/wm/overview/window_selector_controller.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "base/command_line.h"
@@ -483,10 +482,10 @@
   ASSERT_NE(w1->GetRootWindow(), w2->GetRootWindow());
 
   maximize_mode_controller()->EnableMaximizeModeWindowManager(true);
-  EXPECT_TRUE(WmShell::Get()->window_selector_controller()->ToggleOverview());
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->ToggleOverview());
 
   UpdateDisplay("800x600");
-  EXPECT_FALSE(WmShell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
   EXPECT_EQ(w1->GetRootWindow(), w2->GetRootWindow());
 }
 
diff --git a/ash/wm/maximize_mode/maximize_mode_window_manager_unittest.cc b/ash/wm/maximize_mode/maximize_mode_window_manager_unittest.cc
index 580994f..1b5385b 100644
--- a/ash/wm/maximize_mode/maximize_mode_window_manager_unittest.cc
+++ b/ash/wm/maximize_mode/maximize_mode_window_manager_unittest.cc
@@ -1275,7 +1275,7 @@
       CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect2));
 
   WindowSelectorController* window_selector_controller =
-      WmShell::Get()->window_selector_controller();
+      Shell::Get()->window_selector_controller();
   ASSERT_TRUE(window_selector_controller->ToggleOverview());
   ASSERT_TRUE(window_selector_controller->IsSelecting());
   MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc
index 19c7a92b..f965c35 100644
--- a/ash/wm/overview/window_selector_unittest.cc
+++ b/ash/wm/overview/window_selector_unittest.cc
@@ -159,7 +159,7 @@
   }
 
   WindowSelectorController* window_selector_controller() {
-    return WmShell::Get()->window_selector_controller();
+    return Shell::Get()->window_selector_controller();
   }
 
   WindowSelector* window_selector() {
diff --git a/ash/wm/window_cycle_controller_unittest.cc b/ash/wm/window_cycle_controller_unittest.cc
index 29e30f00..c0290ee 100644
--- a/ash/wm/window_cycle_controller_unittest.cc
+++ b/ash/wm/window_cycle_controller_unittest.cc
@@ -112,7 +112,7 @@
   }
 
   const views::Widget* GetWindowCycleListWidget() const {
-    return WmShell::Get()
+    return Shell::Get()
         ->window_cycle_controller()
         ->window_cycle_list()
         ->widget();
@@ -125,7 +125,7 @@
 };
 
 TEST_F(WindowCycleControllerTest, HandleCycleWindowBaseCases) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   // Cycling doesn't crash if there are no windows.
   controller->HandleCycleWindow(WindowCycleController::FORWARD);
@@ -143,7 +143,7 @@
 // Verifies if there is only one window and it isn't active that cycling
 // activates it.
 TEST_F(WindowCycleControllerTest, SingleWindowNotActive) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   // Create a single test window.
   std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
@@ -161,7 +161,7 @@
 }
 
 TEST_F(WindowCycleControllerTest, HandleCycleWindow) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   // Set up several windows to use to test cycling.  Create them in reverse
   // order so they are stacked 0 over 1 over 2.
@@ -273,7 +273,7 @@
   EXPECT_TRUE(window1_state->IsActive());
 
   // Rotate focus, this should move focus to window0.
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
   controller->HandleCycleWindow(WindowCycleController::FORWARD);
   controller->CompleteCycling();
   EXPECT_TRUE(wm::GetWindowState(window0.get())->IsActive());
@@ -298,7 +298,7 @@
   EXPECT_TRUE(window0_state->IsActive());
 
   // Rotate focus, this should move focus to window1 and unminimize it.
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
   controller->HandleCycleWindow(WindowCycleController::FORWARD);
   controller->CompleteCycling();
   EXPECT_FALSE(window0_state->IsActive());
@@ -323,7 +323,7 @@
   window0_state->Minimize();
   window1_state->Minimize();
 
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
   controller->HandleCycleWindow(WindowCycleController::FORWARD);
   controller->CompleteCycling();
   EXPECT_TRUE(window0_state->IsActive());
@@ -341,7 +341,7 @@
 }
 
 TEST_F(WindowCycleControllerTest, AlwaysOnTopWindow) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   // Set up several windows to use to test cycling.
   std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
@@ -367,7 +367,7 @@
 }
 
 TEST_F(WindowCycleControllerTest, AlwaysOnTopMultiWindow) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   // Set up several windows to use to test cycling.
   std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
@@ -400,7 +400,7 @@
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
   ASSERT_EQ(2U, root_windows.size());
 
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   // Create two windows in the primary root.
   std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
@@ -444,7 +444,7 @@
 }
 
 TEST_F(WindowCycleControllerTest, MostRecentlyUsed) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   // Set up several windows to use to test cycling.
   std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
@@ -488,7 +488,7 @@
   // The tested behavior relies on the app list presenter implementation.
   test::TestAppListViewPresenterImpl app_list_presenter_impl;
 
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   std::unique_ptr<aura::Window> window0(CreateTestWindowInShellWithId(0));
   std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1));
@@ -507,7 +507,7 @@
 
 // Tests that cycling through windows doesn't change their minimized state.
 TEST_F(WindowCycleControllerTest, CyclePreservesMinimization) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   std::unique_ptr<aura::Window> window0(CreateTestWindowInShellWithId(0));
   std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1));
@@ -531,7 +531,7 @@
 
 // Tests cycles between panel and normal windows.
 TEST_F(WindowCycleControllerTest, CyclePanels) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   std::unique_ptr<aura::Window> window0(CreateTestWindowInShellWithId(0));
   std::unique_ptr<aura::Window> panel0(CreatePanelWindow());
@@ -559,7 +559,7 @@
 
 // Tests cycles between panel and normal windows.
 TEST_F(WindowCycleControllerTest, CyclePanelsDestroyed) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   std::unique_ptr<aura::Window> window0(CreateTestWindowInShellWithId(0));
   std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1));
@@ -586,7 +586,7 @@
 
 // Tests cycles between panel and normal windows.
 TEST_F(WindowCycleControllerTest, CycleMruPanelDestroyed) {
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
 
   std::unique_ptr<aura::Window> window0(CreateTestWindowInShellWithId(0));
   std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1));
@@ -657,7 +657,7 @@
   EXPECT_LT(0, event_count.GetMouseEventCountAndReset());
 
   // Start cycling.
-  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  WindowCycleController* controller = Shell::Get()->window_cycle_controller();
   controller->HandleCycleWindow(WindowCycleController::FORWARD);
 
   // Most mouse events don't get through.
@@ -749,8 +749,7 @@
     std::unique_ptr<Window> window1(
         CreateTestWindowInShellWithBounds(second_display_bounds));
 
-    WindowCycleController* controller =
-        WmShell::Get()->window_cycle_controller();
+    WindowCycleController* controller = Shell::Get()->window_cycle_controller();
     controller->HandleCycleWindow(WindowCycleController::FORWARD);
 
     const gfx::Rect bounds =
diff --git a/ash/wm/window_cycle_event_filter_aura.cc b/ash/wm/window_cycle_event_filter_aura.cc
index 77ec193..d77397a 100644
--- a/ash/wm/window_cycle_event_filter_aura.cc
+++ b/ash/wm/window_cycle_event_filter_aura.cc
@@ -7,7 +7,6 @@
 #include "ash/common/accelerators/debug_commands.h"
 #include "ash/common/wm/window_cycle_controller.h"
 #include "ash/common/wm/window_cycle_list.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ui/events/event.h"
 
@@ -43,14 +42,13 @@
                !repeat_timer_.IsRunning()) {
       repeat_timer_.Start(
           FROM_HERE, base::TimeDelta::FromMilliseconds(180),
-          base::Bind(
-              &WindowCycleController::HandleCycleWindow,
-              base::Unretained(WmShell::Get()->window_cycle_controller()),
-              event->IsShiftDown() ? WindowCycleController::BACKWARD
-                                   : WindowCycleController::FORWARD));
+          base::Bind(&WindowCycleController::HandleCycleWindow,
+                     base::Unretained(Shell::Get()->window_cycle_controller()),
+                     event->IsShiftDown() ? WindowCycleController::BACKWARD
+                                          : WindowCycleController::FORWARD));
     }
   } else if (event->key_code() == ui::VKEY_ESCAPE) {
-    WmShell::Get()->window_cycle_controller()->CancelCycling();
+    Shell::Get()->window_cycle_controller()->CancelCycling();
   }
 }
 
@@ -73,7 +71,7 @@
   // Views uses VKEY_MENU for both left and right Alt keys.
   if (event->key_code() == ui::VKEY_MENU &&
       event->type() == ui::ET_KEY_RELEASED) {
-    WmShell::Get()->window_cycle_controller()->CompleteCycling();
+    Shell::Get()->window_cycle_controller()->CompleteCycling();
     // Warning: |this| will be deleted from here on.
   }
 }
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 304dfd96..069de98 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -474,6 +474,7 @@
     "mac/scoped_aedesc.h",
     "mac/scoped_authorizationref.h",
     "mac/scoped_block.h",
+    "mac/scoped_cffiledescriptorref.h",
     "mac/scoped_cftyperef.h",
     "mac/scoped_dispatch_object.h",
     "mac/scoped_ionotificationportref.h",
@@ -856,6 +857,7 @@
     "task_scheduler/scheduler_single_thread_task_runner_manager.h",
     "task_scheduler/scheduler_worker.cc",
     "task_scheduler/scheduler_worker.h",
+    "task_scheduler/scheduler_worker_params.h",
     "task_scheduler/scheduler_worker_pool.h",
     "task_scheduler/scheduler_worker_pool_impl.cc",
     "task_scheduler/scheduler_worker_pool_impl.h",
@@ -1054,6 +1056,7 @@
     "version.h",
     "vlog.cc",
     "vlog.h",
+    "win/current_module.h",
     "win/enum_variant.cc",
     "win/enum_variant.h",
     "win/event_trace_consumer.h",
@@ -1981,6 +1984,7 @@
     "i18n/time_formatting_unittest.cc",
     "i18n/timezone_unittest.cc",
     "id_map_unittest.cc",
+    "ios/crb_protocol_observers_unittest.mm",
     "ios/device_util_unittest.mm",
     "ios/weak_nsobject_unittest.mm",
     "json/json_parser_unittest.cc",
diff --git a/base/memory/singleton_objc.h b/base/memory/singleton_objc.h
deleted file mode 100644
index 6df3f775..0000000
--- a/base/memory/singleton_objc.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Support for using the Singleton<T> pattern with Objective-C objects.  A
-// SingletonObjC is the same as a Singleton, except the default traits are
-// appropriate for Objective-C objects.  A typical Objective-C object of type
-// NSExampleType can be maintained as a singleton and accessed with:
-//
-//   NSExampleType* exampleSingleton = SingletonObjC<NSExampleType>::get();
-//
-// The first time this is used, it will create exampleSingleton as the result
-// of [[NSExampleType alloc] init].  Subsequent calls will return the same
-// NSExampleType* object.  The object will be released by calling
-// -[NSExampleType release] when Singleton's atexit routines run
-// (see singleton.h).
-//
-// For Objective-C objects initialized through means other than the
-// no-parameter -init selector, DefaultSingletonObjCTraits may be extended
-// as needed:
-//
-//   struct FooSingletonTraits : public DefaultSingletonObjCTraits<Foo> {
-//     static Foo* New() {
-//       return [[Foo alloc] initWithName:@"selecty"];
-//     }
-//   };
-//   ...
-//   Foo* widgetSingleton = SingletonObjC<Foo, FooSingletonTraits>::get();
-
-#ifndef BASE_MEMORY_SINGLETON_OBJC_H_
-#define BASE_MEMORY_SINGLETON_OBJC_H_
-
-#import <Foundation/Foundation.h>
-#include "base/memory/singleton.h"
-
-// Singleton traits usable to manage traditional Objective-C objects, which
-// are instantiated by sending |alloc| and |init| messages, and are deallocated
-// in a memory-managed environment when their retain counts drop to 0 by
-// sending |release| messages.
-template<typename Type>
-struct DefaultSingletonObjCTraits : public DefaultSingletonTraits<Type> {
-  static Type* New() {
-    return [[Type alloc] init];
-  }
-
-  static void Delete(Type* object) {
-    [object release];
-  }
-};
-
-// Exactly like Singleton, but without the DefaultSingletonObjCTraits as the
-// default trait class.  This makes it straightforward for Objective-C++ code
-// to hold Objective-C objects as singletons.
-template<typename Type,
-         typename Traits = DefaultSingletonObjCTraits<Type>,
-         typename DifferentiatingType = Type>
-class SingletonObjC : public Singleton<Type, Traits, DifferentiatingType> {
-};
-
-#endif  // BASE_MEMORY_SINGLETON_OBJC_H_
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 3fb6c90..916d78a1 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -4,6 +4,7 @@
 
 import("//build/config/android/config.gni")
 import("//build/config/chrome_build.gni")
+import("//build/config/chromecast_build.gni")
 import("//build/config/compiler/compiler.gni")
 import("//build/config/nacl/config.gni")
 import("//build/toolchain/cc_wrapper.gni")
@@ -61,7 +62,8 @@
 
   # Omit unwind support in official builds to save space.
   # We can use breakpad for these builds.
-  exclude_unwind_tables = is_chrome_branded && is_official_build
+  exclude_unwind_tables = (is_chrome_branded && is_official_build) ||
+                          (is_chromecast && !is_cast_desktop_build && !is_debug)
 
   # If true, gold linker will save symbol table inside object files.
   # This speeds up gdb startup by 60%
diff --git a/build/config/sysroot.gni b/build/config/sysroot.gni
index 2bcd6ca..5ea8777 100644
--- a/build/config/sysroot.gni
+++ b/build/config/sysroot.gni
@@ -16,10 +16,6 @@
   target_sysroot_dir = ""
 
   use_sysroot = true
-
-  # TODO(tonikitoo): Remove this arg when wheezy is finally dropped and we
-  # can just use debian/jessie everywhere by default. crbug.com/564904.
-  use_jessie_sysroot = false
 }
 
 if (is_linux && target_sysroot_dir != "") {
@@ -57,20 +53,18 @@
     # functionality where possible) needs to run on the buliders, which are
     # running precise.  The precise build has a different set of dependencies
     # from the wheezy build, so we cannot use the wheezy sysroot.
+    # TODO(sbc): This condition can perhaps be eliminated now that we are
+    # using jessie rather than wheezy.
     sysroot = "//build/linux/ubuntu_precise_amd64-sysroot"
   } else {
     if (current_cpu == "x64") {
-      sysroot = "//build/linux/debian_wheezy_amd64-sysroot"
-
-      if (use_jessie_sysroot) {
-        sysroot = "//build/linux/debian_jessie_amd64-sysroot"
-      }
+      sysroot = "//build/linux/debian_jessie_amd64-sysroot"
     } else if (current_cpu == "x86") {
-      sysroot = "//build/linux/debian_wheezy_i386-sysroot"
+      sysroot = "//build/linux/debian_jessie_i386-sysroot"
     } else if (current_cpu == "mipsel") {
-      sysroot = "//build/linux/debian_wheezy_mips-sysroot"
+      sysroot = "//build/linux/debian_jessie_mips-sysroot"
     } else if (current_cpu == "arm") {
-      sysroot = "//build/linux/debian_wheezy_arm-sysroot"
+      sysroot = "//build/linux/debian_jessie_arm-sysroot"
     } else if (current_cpu == "arm64") {
       sysroot = "//build/linux/debian_jessie_arm64-sysroot"
     } else {
diff --git a/build/linux/sysroot_scripts/install-sysroot.py b/build/linux/sysroot_scripts/install-sysroot.py
index d79c12b..c8e88ee 100755
--- a/build/linux/sysroot_scripts/install-sysroot.py
+++ b/build/linux/sysroot_scripts/install-sysroot.py
@@ -6,16 +6,17 @@
 """Install Debian sysroots for building chromium.
 """
 
-# The sysroot is needed to ensure that binaries will run on Debian Wheezy,
-# the oldest supported linux distribution. For ARM64 linux, we have Debian
-# Jessie sysroot as Jessie is the first version with ARM64 support. This script
-# can be run manually but is more often run as part of gclient hooks. When run
-# from hooks this script is a no-op on non-linux platforms.
+# The sysroot is needed to ensure that binaries that get built will run on
+# the oldest stable version of Debian that we currently support.
+# This script can be run manually but is more often run as part of gclient
+# hooks. When run from hooks this script is a no-op on non-linux platforms.
 
-# The sysroot image could be constructed from scratch based on the current
-# state or Debian Wheezy/Jessie but for consistency we currently use a
-# pre-built root image. The image will normally need to be rebuilt every time
-# chrome's build dependencies are changed.
+# The sysroot image could be constructed from scratch based on the current state
+# of the Debian archive but for consistency we use a pre-built root image (we
+# don't want upstream changes to Debian to effect the chromium build until we
+# choose to pull them in). The images will normally need to be rebuilt every
+# time chrome's build dependencies are changed but should also be updated
+# periodically to include upstream security fixes from Debian.
 
 import hashlib
 import json
@@ -134,14 +135,6 @@
   if target_arch and target_arch not in (host_arch, 'i386'):
     InstallDefaultSysrootForArch(target_arch)
 
-  # Desktop Linux ozone builds require libxkbcommon* which is not
-  # available in Wheezy.
-  # TODO(thomasanderson): Remove this once the Jessie sysroot is used
-  # by default.
-  gyp_defines = gyp_chromium.GetGypVars(gyp_chromium.GetSupplementalFiles())
-  if gyp_defines.get('use_ozone') == '1':
-    InstallSysroot('Jessie', 'amd64')
-
 
 def main(args):
   parser = optparse.OptionParser('usage: %prog [OPTIONS]', description=__doc__)
@@ -150,6 +143,9 @@
                                         ' Installs default sysroot images.')
   parser.add_option('--arch', type='choice', choices=VALID_ARCHS,
                     help='Sysroot architecture: %s' % ', '.join(VALID_ARCHS))
+  parser.add_option('--all', action='store_true',
+                    help='Install all sysroot images (useful when updating the'
+                         ' images)')
   options, _ = parser.parse_args(args)
   if options.running_as_hook and not sys.platform.startswith('linux'):
     return 0
@@ -160,27 +156,23 @@
     if host_arch in ['ppc','s390']:
       return 0
     InstallDefaultSysroots(host_arch)
-  else:
-    if not options.arch:
-      print 'You much specify either --arch or --running-as-hook'
-      return 1
+  elif options.arch:
     InstallDefaultSysrootForArch(options.arch)
+  elif options.all:
+    for arch in VALID_ARCHS:
+      InstallDefaultSysrootForArch(arch)
+  else:
+    print 'You much specify either --arch, --all or --running-as-hook'
+    return 1
 
   return 0
 
+
 def InstallDefaultSysrootForArch(target_arch):
-  if target_arch == 'amd64':
-    InstallSysroot('Wheezy', 'amd64')
-  elif target_arch == 'arm':
-    InstallSysroot('Wheezy', 'arm')
-  elif target_arch == 'arm64':
-    InstallSysroot('Jessie', 'arm64')
-  elif target_arch == 'i386':
-    InstallSysroot('Wheezy', 'i386')
-  elif target_arch == 'mips':
-    InstallSysroot('Wheezy', 'mips')
-  else:
+  if target_arch not in VALID_ARCHS:
     raise Error('Unknown architecture: %s' % target_arch)
+  InstallSysroot('Jessie', target_arch)
+
 
 def InstallSysroot(target_platform, target_arch):
   # The sysroot directory should match the one specified in build/common.gypi.
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
index 73783e3..fca394e 100755
--- a/build/vs_toolchain.py
+++ b/build/vs_toolchain.py
@@ -352,6 +352,9 @@
   if env_version == '2015':
     # Update 3 final with patches with 10.0.14393.0 SDK.
     return ['d3cb0e37bdd120ad0ac4650b674b09e81be45616']
+  if env_version == '2017':
+    # VS 2017 RTM with 10.0.14393.0 SDK.
+    return ['716b3fda0f857c3dc24d795d1a4d74e1e740face']
   raise Exception('Unsupported VS version %s' % env_version)
 
 
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 2721a8a..0e587aa 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -2450,6 +2450,9 @@
   if (overdraw_feedback_)
     FlushOverdrawFeedback(swap_buffer_rect_);
 
+  if (use_swap_with_bounds_)
+    swap_content_bounds_ = current_frame()->root_content_bounds;
+
   current_framebuffer_lock_ = nullptr;
 
   gl_->Disable(GL_BLEND);
@@ -2614,7 +2617,7 @@
   output_frame.latency_info = std::move(latency_info);
   output_frame.size = surface_size;
   if (use_swap_with_bounds_) {
-    output_frame.content_bounds = current_frame()->root_content_bounds;
+    output_frame.content_bounds = std::move(swap_content_bounds_);
   } else if (use_partial_swap_) {
     // If supported, we can save significant bandwidth by only swapping the
     // damaged/scissored region (clamped to the viewport).
diff --git a/cc/output/gl_renderer.h b/cc/output/gl_renderer.h
index 682a3d7ca..2f53a748 100644
--- a/cc/output/gl_renderer.h
+++ b/cc/output/gl_renderer.h
@@ -55,6 +55,8 @@
              int highp_threshold_min);
   ~GLRenderer() override;
 
+  bool use_swap_with_bounds() const { return use_swap_with_bounds_; }
+
   void SwapBuffers(std::vector<ui::LatencyInfo> latency_info) override;
   void SwapBuffersComplete() override;
 
@@ -313,6 +315,7 @@
   TextureMailboxDeleter* texture_mailbox_deleter_;
 
   gfx::Rect swap_buffer_rect_;
+  std::vector<gfx::Rect> swap_content_bounds_;
   gfx::Rect scissor_rect_;
   bool is_scissor_enabled_ = false;
   bool stencil_shadow_ = false;
diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc
index fd5faa1..8ab2e5d 100644
--- a/cc/output/gl_renderer_unittest.cc
+++ b/cc/output/gl_renderer_unittest.cc
@@ -2161,5 +2161,105 @@
   Mock::VerifyAndClearExpectations(context_support_ptr_);
 }
 
+class SwapWithBoundsMockGLES2Interface : public TestGLES2Interface {
+ public:
+  void InitializeTestContext(TestWebGraphicsContext3D* context) override {
+    context->set_have_swap_buffers_with_bounds(true);
+  }
+};
+
+class ContentBoundsOverlayProcessor : public OverlayProcessor {
+ public:
+  class Strategy : public OverlayProcessor::Strategy {
+   public:
+    explicit Strategy(const std::vector<gfx::Rect>& content_bounds)
+        : content_bounds_(content_bounds) {}
+    ~Strategy() override {}
+    bool Attempt(ResourceProvider* resource_provider,
+                 RenderPass* render_pass,
+                 OverlayCandidateList* candidates,
+                 std::vector<gfx::Rect>* content_bounds) override {
+      content_bounds->insert(content_bounds->end(), content_bounds_.begin(),
+                             content_bounds_.end());
+      return true;
+    }
+
+    const std::vector<gfx::Rect> content_bounds_;
+  };
+
+  ContentBoundsOverlayProcessor(OutputSurface* surface,
+                                const std::vector<gfx::Rect>& content_bounds)
+      : OverlayProcessor(surface), content_bounds_(content_bounds) {}
+
+  void Initialize() override {
+    strategy_ = new Strategy(content_bounds_);
+    strategies_.push_back(base::WrapUnique(strategy_));
+  }
+
+  Strategy* strategy_;
+  const std::vector<gfx::Rect> content_bounds_;
+};
+
+class GLRendererSwapWithBoundsTest : public GLRendererTest {
+ protected:
+  void RunTest(const std::vector<gfx::Rect>& content_bounds) {
+    auto gl_owned = base::MakeUnique<SwapWithBoundsMockGLES2Interface>();
+
+    auto provider = TestContextProvider::Create(std::move(gl_owned));
+    provider->BindToCurrentThread();
+
+    FakeOutputSurfaceClient output_surface_client;
+    std::unique_ptr<FakeOutputSurface> output_surface(
+        FakeOutputSurface::Create3d(std::move(provider)));
+    output_surface->BindToClient(&output_surface_client);
+
+    std::unique_ptr<ResourceProvider> resource_provider =
+        FakeResourceProvider::Create(output_surface->context_provider(),
+                                     nullptr);
+
+    RendererSettings settings;
+    FakeRendererGL renderer(&settings, output_surface.get(),
+                            resource_provider.get());
+    renderer.Initialize();
+    EXPECT_EQ(true, renderer.use_swap_with_bounds());
+    renderer.SetVisible(true);
+
+    OverlayProcessor* processor =
+        new ContentBoundsOverlayProcessor(output_surface.get(), content_bounds);
+    processor->Initialize();
+    renderer.SetOverlayProcessor(processor);
+
+    gfx::Size viewport_size(100, 100);
+
+    {
+      int root_pass_id = 1;
+      AddRenderPass(&render_passes_in_draw_order_, root_pass_id,
+                    gfx::Rect(viewport_size), gfx::Transform(),
+                    FilterOperations());
+
+      renderer.DecideRenderPassAllocationsForFrame(
+          render_passes_in_draw_order_);
+      DrawFrame(&renderer, viewport_size);
+      renderer.SwapBuffers(std::vector<ui::LatencyInfo>());
+
+      std::vector<gfx::Rect> expected_content_bounds;
+      EXPECT_EQ(content_bounds,
+                output_surface->last_sent_frame()->content_bounds);
+    }
+  }
+};
+
+TEST_F(GLRendererSwapWithBoundsTest, EmptyContent) {
+  std::vector<gfx::Rect> content_bounds;
+  RunTest(content_bounds);
+}
+
+TEST_F(GLRendererSwapWithBoundsTest, NonEmpty) {
+  std::vector<gfx::Rect> content_bounds;
+  content_bounds.push_back(gfx::Rect(0, 0, 10, 10));
+  content_bounds.push_back(gfx::Rect(20, 20, 30, 30));
+  RunTest(content_bounds);
+}
+
 }  // namespace
 }  // namespace cc
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index 7b1638d9..6e932e9a 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -3493,7 +3493,7 @@
   // and 4 bytes for LUT-based transforms (determined empirically).
   FuzzyPixelComparator comparator(false, 100.f, 0.f, 2.f, 2, 0);
   if (!transform->CanGetShaderSource())
-    comparator = FuzzyPixelComparator(false, 100.f, 0.f, 4.f, 4, 0);
+    comparator = FuzzyPixelComparator(false, 100.f, 0.f, 6.f, 6, 0);
   EXPECT_TRUE(RunPixelTest(&pass_list, &expected_output_colors, comparator));
 }
 
diff --git a/cc/test/test_web_graphics_context_3d.h b/cc/test/test_web_graphics_context_3d.h
index 233c067e..617d09f 100644
--- a/cc/test/test_web_graphics_context_3d.h
+++ b/cc/test/test_web_graphics_context_3d.h
@@ -314,6 +314,9 @@
   void set_have_post_sub_buffer(bool have) {
     test_capabilities_.post_sub_buffer = have;
   }
+  void set_have_swap_buffers_with_bounds(bool have) {
+    test_capabilities_.swap_buffers_with_bounds = have;
+  }
   void set_have_commit_overlay_planes(bool have) {
     test_capabilities_.commit_overlay_planes = have;
   }
diff --git a/chrome/VERSION b/chrome/VERSION
index 443f470..5c7d831 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=59
 MINOR=0
-BUILD=3051
+BUILD=3054
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
index b8f7167..c4d114b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser;
 
 import android.app.Notification;
-import android.content.Context;
 import android.content.Intent;
 import android.os.Handler;
 import android.os.Looper;
@@ -28,9 +27,6 @@
 import org.chromium.chrome.browser.metrics.VariationsSession;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
 import org.chromium.chrome.browser.net.qualityprovider.ExternalEstimateProviderAndroid;
-import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder;
-import org.chromium.chrome.browser.notifications.NotificationBuilder;
-import org.chromium.chrome.browser.notifications.NotificationCompatBuilder;
 import org.chromium.chrome.browser.omaha.RequestGenerator;
 import org.chromium.chrome.browser.physicalweb.PhysicalWebBleClient;
 import org.chromium.chrome.browser.policy.PolicyAuditor;
@@ -109,24 +105,6 @@
         return null;
     }
 
-    /**
-     * Creates either a Notification.Builder or NotificationCompat.Builder under the hood, wrapped
-     * in our own common interface. Should be used for all notifications we create.
-     *
-     * TODO(awdf) Remove this once we've updated to revision 26 of the support library.
-     *
-     * @param preferCompat if a NotificationCompat.Builder is preferred.
-     * @param notificationCategoryGroupId
-     * @param notificationCategoryGroupName
-     */
-    public ChromeNotificationBuilder createChromeNotificationBuilder(boolean preferCompat,
-            String notificationCategoryId, String notificationCategoryName,
-            String notificationCategoryGroupId, String notificationCategoryGroupName) {
-        Context context = ContextUtils.getApplicationContext();
-        return preferCompat ? new NotificationCompatBuilder(context)
-                            : new NotificationBuilder(context);
-    }
-
     /** Returns the singleton instance of ChromeShortcutManager */
     public ChromeShortcutManager createChromeShortcutManager() {
         return new ChromeShortcutManager();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
index f9dc229..03fedcb8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -319,9 +319,9 @@
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory
                         .createChromeNotificationBuilder(true /* preferCompat */,
-                                NotificationConstants.CATEGORY_ID_BROWSER,
+                                NotificationConstants.CHANNEL_ID_BROWSER,
                                 context.getString(R.string.notification_category_browser),
-                                NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                                NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                                 context.getString(R.string.notification_category_group_general))
                         .setContentTitle(
                                 context.getString(R.string.download_notification_summary_title))
@@ -1010,9 +1010,9 @@
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory
                         .createChromeNotificationBuilder(true /* preferCompat */,
-                                NotificationConstants.CATEGORY_ID_BROWSER,
+                                NotificationConstants.CHANNEL_ID_BROWSER,
                                 mContext.getString(R.string.notification_category_browser),
-                                NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                                NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                                 mContext.getString(R.string.notification_category_group_general))
                         .setContentTitle(
                                 DownloadUtils.getAbbreviatedFileName(title, MAX_FILE_NAME_LENGTH))
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
index 2512774..a033b03 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
@@ -34,9 +34,9 @@
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory
                         .createChromeNotificationBuilder(true /* preferCompat */,
-                                NotificationConstants.CATEGORY_ID_BROWSER,
+                                NotificationConstants.CHANNEL_ID_BROWSER,
                                 context.getString(R.string.notification_category_browser),
-                                NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                                NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                                 context.getString(R.string.notification_category_group_general))
                         .setContentTitle(title)
                         .setContentIntent(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
index 284dfa7..88ff379 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
@@ -165,9 +165,9 @@
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory
                         .createChromeNotificationBuilder(true /* preferCompat */,
-                                NotificationConstants.CATEGORY_ID_BROWSER,
+                                NotificationConstants.CHANNEL_ID_BROWSER,
                                 mContext.getString(R.string.notification_category_browser),
-                                NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                                NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                                 mContext.getString(R.string.notification_category_group_general))
                         .setAutoCancel(false)
                         .setOngoing(true)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
index f8208a1..7ee2d19 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
@@ -758,9 +758,9 @@
 
     private void updateNotificationBuilder() {
         mNotificationBuilder = NotificationBuilderFactory.createChromeNotificationBuilder(
-                true /* preferCompat */, NotificationConstants.CATEGORY_ID_BROWSER,
+                true /* preferCompat */, NotificationConstants.CHANNEL_ID_BROWSER,
                 mContext.getString(org.chromium.chrome.R.string.notification_category_browser),
-                NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                 mContext.getString(
                         org.chromium.chrome.R.string.notification_category_group_general));
         setMediaStyleLayoutForNotificationBuilder(mNotificationBuilder);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
index 697e793..cd8e7a14 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
@@ -142,10 +142,10 @@
         // TODO(crbug.com/697104) We should probably use a Compat builder.
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory.createChromeNotificationBuilder(false /* preferCompat */,
-                        NotificationConstants.CATEGORY_ID_SITES,
+                        NotificationConstants.CHANNEL_ID_SITES,
                         mContext.getString(
                                 org.chromium.chrome.R.string.notification_category_sites),
-                        NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                        NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                         mContext.getString(
                                 org.chromium.chrome.R.string.notification_category_group_general));
         builder.setTicker(mTickerText);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderForO.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderForO.java
index 724dadd..2daa053 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderForO.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderForO.java
@@ -92,7 +92,7 @@
     }
 
     private static int getChannelImportance(String channelId) {
-        return NotificationConstants.CATEGORY_ID_SITES.equals(channelId)
+        return NotificationConstants.CHANNEL_ID_SITES.equals(channelId)
                 ? NotificationManager.IMPORTANCE_DEFAULT
                 : NotificationManager.IMPORTANCE_LOW;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
index 39601f23..5721df25 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
@@ -87,7 +87,7 @@
     static final String GROUP_WEB_PREFIX = "Web:";
 
     // Notification channel ids.
-    public static final String CATEGORY_ID_BROWSER = "browser";
-    public static final String CATEGORY_ID_SITES = "sites";
-    public static final String CATEGORY_GROUP_ID_GENERAL = "general";
+    public static final String CHANNEL_ID_BROWSER = "browser";
+    public static final String CHANNEL_ID_SITES = "sites";
+    public static final String CHANNEL_GROUP_ID_GENERAL = "general";
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java
index 025f167..dbda582 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java
@@ -26,10 +26,10 @@
         // TODO(crbug.com/697104) We should probably use a Compat builder.
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory.createChromeNotificationBuilder(false /* preferCompat */,
-                        NotificationConstants.CATEGORY_ID_SITES,
+                        NotificationConstants.CHANNEL_ID_SITES,
                         mContext.getString(
                                 org.chromium.chrome.R.string.notification_category_sites),
-                        NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                        NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                         mContext.getString(
                                 org.chromium.chrome.R.string.notification_category_group_general));
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java
index 07c2db4..91ae359 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java
@@ -153,9 +153,9 @@
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory
                         .createChromeNotificationBuilder(true /* preferCompat */,
-                                NotificationConstants.CATEGORY_ID_BROWSER,
+                                NotificationConstants.CHANNEL_ID_BROWSER,
                                 context.getString(R.string.notification_category_browser),
-                                NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                                NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                                 context.getString(R.string.notification_category_group_general))
                         .setAutoCancel(true)
                         .setContentIntent(PendingIntent.getBroadcast(context, 0, contentIntent, 0))
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBroadcastService.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBroadcastService.java
index d267ba5..5f6588f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBroadcastService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBroadcastService.java
@@ -151,9 +151,9 @@
         ChromeNotificationBuilder notificationBuilder =
                 NotificationBuilderFactory
                         .createChromeNotificationBuilder(true /* preferCompat */,
-                                NotificationConstants.CATEGORY_ID_BROWSER,
+                                NotificationConstants.CHANNEL_ID_BROWSER,
                                 context.getString(R.string.notification_category_browser),
-                                NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                                NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                                 context.getString(R.string.notification_category_group_general))
                         .setSmallIcon(R.drawable.ic_image_white_24dp)
                         .setContentTitle(getString(R.string.physical_web_broadcast_notification))
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
index 643225f..0d3f4e7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
@@ -104,10 +104,10 @@
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory
                         .createChromeNotificationBuilder(true /* preferCompat */,
-                                NotificationConstants.CATEGORY_ID_BROWSER,
+                                NotificationConstants.CHANNEL_ID_BROWSER,
                                 mApplicationContext.getString(
                                         R.string.notification_category_browser),
-                                NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
+                                NotificationConstants.CHANNEL_GROUP_ID_GENERAL,
                                 mApplicationContext.getString(
                                         R.string.notification_category_group_general))
                         .setAutoCancel(true)
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 07b7640..1159cb81 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -784,7 +784,7 @@
       </message>
 
       <!-- Single site settings -->
-      <message name="IDS_NO_SAVED_WEBSITE_SETTINGS" desc="Text to display when there are no saved webiste settings.">
+      <message name="IDS_NO_SAVED_WEBSITE_SETTINGS" desc="Text to display when there are no saved website settings.">
         You have no saved website settings.
       </message>
 
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn
index d58f5860..bb56963b 100644
--- a/chrome/app/BUILD.gn
+++ b/chrome/app/BUILD.gn
@@ -366,7 +366,6 @@
 chrome_packaged_services = [
   ":chrome_manifest",
   "//chrome/browser:preferences_manifest",
-  "//services/image_decoder:manifest",
 ]
 
 service_manifest("chrome_manifest") {
@@ -492,7 +491,7 @@
   ]
 
   if (enable_package_mash_services) {
-    catalog("catalog_for_mash") {
+    catalog("catalog_for_mus") {
       embedded_services =
           chrome_embedded_services +
           [ ":chrome_content_packaged_services_manifest_for_mash" ]
diff --git a/chrome/app/chrome_main.cc b/chrome/app/chrome_main.cc
index c5177ec1..2cc37702 100644
--- a/chrome/app/chrome_main.cc
+++ b/chrome/app/chrome_main.cc
@@ -110,8 +110,10 @@
   version_info::Channel channel = chrome::GetChannel();
   if (channel == version_info::Channel::CANARY ||
       channel == version_info::Channel::UNKNOWN) {
-    if (command_line->HasSwitch(switches::kMash))
+    if (command_line->HasSwitch(switches::kMash) ||
+        command_line->HasSwitch(switches::kMus)) {
       return MashMain();
+    }
     WaitForMashDebuggerIfNecessary();
     if (service_manager::ServiceManagerIsRemote())
       params.env_mode = aura::Env::Mode::MUS;
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 51bb1862..ef8f209ec 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -4443,6 +4443,9 @@
         <message name="IDS_MD_EXTENSIONS_LOAD_ERROR_FILE_LABEL" desc="The label next to the file path of an unpacked extension that failed to load.">
           File
         </message>
+        <message name="IDS_MD_EXTENSIONS_LOAD_ERROR_COULD_NOT_LOAD_MANIFEST" desc="The text to indicate that an extension's manifest could not be loaded.">
+          Could not load manifest.
+        </message>
         <message name="IDS_MD_EXTENSIONS_LOAD_ERROR_CANCEL" desc="The text on the button to close the dialog when an unpacked extension failed to load.">
           Cancel
         </message>
@@ -15069,6 +15072,13 @@
         Enables the new API to fetch Doodles for the NTP.
       </message>
     </if>
+
+    <message name="IDS_FLAGS_DELAY_NAVIGATION_NAME" desc="Title for the flag to delay navigation" translateable="false">
+      Delay navigations
+    </message>
+    <message name="IDS_FLAGS_DELAY_NAVIGATION_DESCRIPTION" desc="Description for the flag to delay navigation" translateable="false">
+      Add a fixed delay to main frame navigations.
+    </message>
   </messages>
  </release>
 </grit>
diff --git a/chrome/app/mash/BUILD.gn b/chrome/app/mash/BUILD.gn
index 68caea6..ba8bd1ff 100644
--- a/chrome/app/mash/BUILD.gn
+++ b/chrome/app/mash/BUILD.gn
@@ -38,7 +38,10 @@
   ]
 
   if (is_chromeos) {
-    deps += [ "//ash/resources" ]
+    deps += [
+      ":chrome_mus_catalog",
+      "//ash/resources",
+    ]
   }
 
   if (is_posix) {
@@ -81,7 +84,7 @@
 
 catalog("catalog") {
   embedded_services = [ ":mash_manifest" ]
-  catalog_deps = [ "//chrome/app:catalog_for_mash" ]
+  catalog_deps = [ "//chrome/app:catalog_for_mus" ]
   standalone_services = [
     "//mash/example/views_examples:manifest",
     "//mash/simple_wm:manifest",
@@ -99,3 +102,30 @@
     "mash_service_overrides.json",
   ]
 }
+
+if (is_chromeos) {
+  service_manifest("mus_manifest") {
+    name = "chrome_mus"
+    source = "chrome_mus_manifest.json"
+    packaged_services = [
+      "//services/ui:manifest",
+
+      # TODO(sky): verify if we need this.
+      "//services/ui/ime/test_ime_driver:manifest",
+    ]
+
+    if (enable_nacl) {
+      packaged_services += [ "//components/nacl/loader:nacl_loader_manifest" ]
+    }
+  }
+
+  catalog("catalog_mus") {
+    embedded_services = [ ":mus_manifest" ]
+    catalog_deps = [ "//chrome/app:catalog_for_mus" ]
+  }
+
+  catalog_cpp_source("chrome_mus_catalog") {
+    catalog = ":catalog_mus"
+    generated_function_name = "CreateChromeMusCatalog"
+  }
+}
diff --git a/chrome/app/mash/chrome_mash_manifest.json b/chrome/app/mash/chrome_mash_manifest.json
index 2e808ef..ec970f1b 100644
--- a/chrome/app/mash/chrome_mash_manifest.json
+++ b/chrome/app/mash/chrome_mash_manifest.json
@@ -16,11 +16,11 @@
       },
       "requires": {
         "*": [ "app" ],
-        "service_manager": [ "service_manager:instance_per_child" ],
-        "catalog": [ "control" ],
         "ash": [ "app" ],
+        "catalog": [ "control" ],
         "content_browser": [ "app" ],
         "quick_launch": [ "app" ],
+        "service_manager": [ "service_manager:instance_per_child" ],
         "ui": [ "app" ]
       }
     }
diff --git a/chrome/app/mash/chrome_mus_manifest.json b/chrome/app/mash/chrome_mus_manifest.json
new file mode 100644
index 0000000..7712b5f
--- /dev/null
+++ b/chrome/app/mash/chrome_mus_manifest.json
@@ -0,0 +1,26 @@
+{
+  // NOTE: This is the manifest for service:chrome_mus, which is only used to
+  // package services for the Mus environment when baked into the Chrome binary
+  // (i.e. "chrome --mus")
+  //
+  // If you need to require or provide capabilities from Chrome itself within
+  // the you should instead modify chrome_content_browser_manifest_overlay.json.
+  "name": "chrome_mus",
+  "display_name": "Chrome Mus Packaged Services",
+  "interface_provider_specs": {
+    "service_manager:connector": {
+      "provides": {
+        "service_manager:service_factory": [
+          "service_manager::mojom::ServiceFactory"
+        ]
+      },
+      "requires": {
+        "*": [ "app" ],
+        "catalog": [ "control" ],
+        "content_browser": [ "app" ],
+        "service_manager": [ "service_manager:instance_per_child" ],
+        "ui": [ "app" ]
+      }
+    }
+  }
+}
diff --git a/chrome/app/mash/mash_runner.cc b/chrome/app/mash/mash_runner.cc
index a755f5b..e857c97 100644
--- a/chrome/app/mash/mash_runner.cc
+++ b/chrome/app/mash/mash_runner.cc
@@ -62,6 +62,10 @@
 #include "chrome/app/shutdown_signal_handlers_posix.h"
 #endif  // defined(OS_POSIX)
 
+#if defined(OS_CHROMEOS)
+#include "chrome/app/mash/chrome_mus_catalog.h"
+#endif
+
 using service_manager::mojom::ServiceFactory;
 
 namespace {
@@ -71,6 +75,10 @@
 
 const char kChromeMashServiceName[] = "chrome_mash";
 
+// Name used for --mus. This is only applicable to ChromeOS. it is placed
+// outside of ifdefs to make code slightly more readable.
+const char kChromeMusServiceName[] = "chrome_mus";
+
 bool IsChild() {
   return base::CommandLine::ForCurrentProcess()->HasSwitch(
              switches::kProcessType) &&
@@ -100,6 +108,7 @@
         const service_manager::Identity& target,
         base::CommandLine* command_line) override {
     if (target.name() == kChromeMashServiceName ||
+        target.name() == kChromeMusServiceName ||
         target.name() == content::mojom::kPackagedServicesServiceName) {
       base::FilePath exe_path;
       base::PathService::Get(base::FILE_EXE, &exe_path);
@@ -116,14 +125,21 @@
     }
 
     // When launching the browser process, ensure that we don't inherit the
-    // --mash flag so it proceeds with the normal content/browser startup path.
+    // the mash/mus flag so it proceeds with the normal content/browser startup
+    // path.
+    const bool is_mash = command_line->HasSwitch(switches::kMash);
     base::CommandLine::SwitchMap new_switches = command_line->GetSwitches();
     new_switches.erase(switches::kMash);
+    new_switches.erase(switches::kMus);
     *command_line = base::CommandLine(command_line->GetProgram());
     for (const std::pair<std::string, base::CommandLine::StringType>& sw :
          new_switches) {
       command_line->AppendSwitchNative(sw.first, sw.second);
     }
+    // Add kMusConfig so that launched processes know what config they are
+    // running in.
+    command_line->AppendSwitchASCII(switches::kMusConfig,
+                                    is_mash ? switches::kMash : switches::kMus);
   }
 
   DISALLOW_COPY_AND_ASSIGN(ServiceProcessLauncherDelegateImpl);
@@ -190,15 +206,24 @@
   // shouldn't we using context as it has a lot of stuff we don't really want
   // in chrome.
   ServiceProcessLauncherDelegateImpl service_process_launcher_delegate;
+  const bool is_mash =
+      base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kMash);
+#if defined(OS_CHROMEOS)
+  service_manager::BackgroundServiceManager background_service_manager(
+      &service_process_launcher_delegate,
+      is_mash ? CreateChromeMashCatalog() : CreateChromeMusCatalog());
+#else
   service_manager::BackgroundServiceManager background_service_manager(
       &service_process_launcher_delegate, CreateChromeMashCatalog());
+#endif
   service_manager::mojom::ServicePtr service;
   service_manager::ServiceContext context(
       base::MakeUnique<mash::MashPackagedService>(),
       service_manager::mojom::ServiceRequest(&service));
   background_service_manager.RegisterService(
       service_manager::Identity(
-          kChromeMashServiceName, service_manager::mojom::kRootUserID),
+          is_mash ? kChromeMashServiceName : kChromeMusServiceName,
+          service_manager::mojom::kRootUserID),
       std::move(service), nullptr);
 
   // Quit the main process if an important child (e.g. window manager) dies.
@@ -219,9 +244,11 @@
   // Ping services that we know we want to launch on startup (UI service,
   // window manager, quick launch app).
   context.connector()->Connect(ui::mojom::kServiceName);
-  context.connector()->Connect(mash::common::GetWindowManagerServiceName());
-  context.connector()->Connect(mash::quick_launch::mojom::kServiceName);
   context.connector()->Connect(content::mojom::kPackagedServicesServiceName);
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kMash)) {
+    context.connector()->Connect(mash::common::GetWindowManagerServiceName());
+    context.connector()->Connect(mash::quick_launch::mojom::kServiceName);
+  }
 
   run_loop.Run();
 
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 61993ae..fe630399 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -340,6 +340,9 @@
   <message name="IDS_SETTINGS_TOGGLE_OFF" desc="Label used on a main settings toggle that is ooff.">
     Off
   </message>
+  <message name="IDS_SETTINGS_NOT_VALID" desc="Text indicating that an input is not valid.">
+   Not valid
+  </message>
 
   <!-- Passwords and Autofill Page -->
   <message name="IDS_SETTINGS_PASSWORDS_AND_AUTOFILL_PAGE_TITLE" desc="Name of the settings page which allows managing passwords and autofill settings.">
@@ -1729,9 +1732,6 @@
   <message name="IDS_SETTINGS_SEARCH_ENGINES_EDIT_SEARCH_ENGINE" desc="Title for a dialog that allows editing an existing search engine.">
     Edit search engine
   </message>
-  <message name="IDS_SETTINGS_SEARCH_ENGINES_NOT_VALID" desc="Text indicating that the input to a given text field in the add/edit search engine dialog is not invalid.">
-   Not valid
-  </message>
   <message name="IDS_SETTINGS_SEARCH_ENGINES_DEFAULT_ENGINES" desc="Label for 'default' Search Engines section">
     Default search engines
   </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 640e7ce..d227eff2 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -780,6 +780,8 @@
     "offline_items_collection/offline_content_aggregator_factory.h",
     "page_load_metrics/browser_page_track_decider.cc",
     "page_load_metrics/browser_page_track_decider.h",
+    "page_load_metrics/experiments/delay_navigation_throttle.cc",
+    "page_load_metrics/experiments/delay_navigation_throttle.h",
     "page_load_metrics/metrics_navigation_throttle.cc",
     "page_load_metrics/metrics_navigation_throttle.h",
     "page_load_metrics/metrics_web_contents_observer.cc",
@@ -1588,8 +1590,8 @@
     "//ppapi/features",
     "//printing/features",
     "//rlz/features",
+    "//services/data_decoder/public/cpp",
     "//services/identity:lib",
-    "//services/image_decoder/public/cpp",
     "//services/preferences/public/cpp",
     "//services/preferences/public/cpp:service_main",
     "//services/preferences/public/interfaces",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 73b2f059..4c3d004e 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -47,9 +47,8 @@
   "+ppapi/shared_impl",
   "+rlz",
   "+sandbox/win/src",  # The path doesn't say it, but this is the Windows sandbox.
+  "+services/data_decoder/public/cpp",
   "+services/identity/public/interfaces",
-  "+services/image_decoder/public/cpp",
-  "+services/image_decoder/public/interfaces",
   "+services/preferences/public/cpp",
   "+services/preferences/public/interfaces",
   "+services/service_manager",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 52bea44..b3053a69 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -27,6 +27,7 @@
 #include "build/build_config.h"
 #include "cc/base/switches.h"
 #include "chrome/browser/ntp_snippets/ntp_snippets_features.h"
+#include "chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.h"
 #include "chrome/browser/predictors/resource_prefetch_common.h"
 #include "chrome/browser/prerender/prerender_field_trial.h"
 #include "chrome/common/channel_info.h"
@@ -756,6 +757,27 @@
          arraysize(kAutofillCreditCardLastUsedDateFeatureVariationExpDate),
          nullptr}};
 
+const FeatureEntry::FeatureParam kDelayNavigation5SecondDelay[] = {
+    {DelayNavigationThrottle::kParamDelayNavigationDurationMillis, "5000"},
+    {DelayNavigationThrottle::kParamDelayNavigationProbability, "1"}};
+
+const FeatureEntry::FeatureParam kDelayNavigation5SecondDelay25Percent[] = {
+    {DelayNavigationThrottle::kParamDelayNavigationDurationMillis, "5000"},
+    {DelayNavigationThrottle::kParamDelayNavigationProbability, "0.25"}};
+
+const FeatureEntry::FeatureParam kDelayNavigation5SecondDelayRandomize[] = {
+    {DelayNavigationThrottle::kParamDelayNavigationDurationMillis, "5000"},
+    {DelayNavigationThrottle::kParamDelayNavigationProbability, "1"},
+    {DelayNavigationThrottle::kParamDelayNavigationRandomize, "true"}};
+
+const FeatureEntry::FeatureVariation kDelayNavigationFeatureVariations[] = {
+    {"(5 second delay, 100% probability)", kDelayNavigation5SecondDelay,
+     arraysize(kDelayNavigation5SecondDelay), nullptr},
+    {"(5 second delay, 25% probability)", kDelayNavigation5SecondDelay25Percent,
+     arraysize(kDelayNavigation5SecondDelay25Percent), nullptr},
+    {"(0-5 second randomized delay)", kDelayNavigation5SecondDelayRandomize,
+     arraysize(kDelayNavigation5SecondDelayRandomize), nullptr}};
+
 // RECORDING USER METRICS FOR FLAGS:
 // -----------------------------------------------------------------------------
 // The first line of the entry is the internal name.
@@ -2397,6 +2419,12 @@
      FEATURE_VALUE_TYPE(chrome::android::kUseNewDoodleApi)},
 #endif  // OS_ANDROID
 
+    {"delay-navigation", IDS_FLAGS_DELAY_NAVIGATION_NAME,
+     IDS_FLAGS_DELAY_NAVIGATION_DESCRIPTION, kOsAll,
+     FEATURE_WITH_PARAMS_VALUE_TYPE(kDelayNavigationFeature,
+                                    kDelayNavigationFeatureVariations,
+                                    "DelayNavigation")},
+
     // NOTE: Adding new command-line switches requires adding corresponding
     // entries to enum "LoginCustomFlags" in histograms.xml. See note in
     // histograms.xml and don't forget to run AboutFlagsHistogramTest unit test.
diff --git a/chrome/browser/accessibility/accessibility_extension_api.cc b/chrome/browser/accessibility/accessibility_extension_api.cc
index 66aa8e9df..504c126 100644
--- a/chrome/browser/accessibility/accessibility_extension_api.cc
+++ b/chrome/browser/accessibility/accessibility_extension_api.cc
@@ -30,6 +30,9 @@
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/chromeos/ui/accessibility_focus_ring_controller.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/power_manager_client.h"
+
 using chromeos::AccessibilityFocusRingController;
 #endif
 
@@ -129,3 +132,24 @@
 
   return RespondNow(Error(kErrorNotSupported));
 }
+
+ExtensionFunction::ResponseAction
+AccessibilityPrivateDarkenScreenFunction::Run() {
+  ChromeExtensionFunctionDetails details(this);
+  CHECK(extension());
+
+#if defined(OS_CHROMEOS)
+  bool darken;
+  EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(0, &darken));
+  chromeos::PowerManagerClient* client =
+      chromeos::DBusThreadManager::Get()->GetPowerManagerClient();
+
+  // Called twice to ensure the cros end of the dbus message is in a good
+  // state.
+  client->SetBacklightsForcedOff(!darken);
+  client->SetBacklightsForcedOff(darken);
+  return RespondNow(NoArguments());
+#endif  // defined OS_CHROMEOS
+
+  return RespondNow(Error(kErrorNotSupported));
+}
diff --git a/chrome/browser/accessibility/accessibility_extension_api.h b/chrome/browser/accessibility/accessibility_extension_api.h
index 04078de0..3784ec4e 100644
--- a/chrome/browser/accessibility/accessibility_extension_api.h
+++ b/chrome/browser/accessibility/accessibility_extension_api.h
@@ -41,4 +41,13 @@
                              ACCESSIBILITY_PRIVATE_SETKEYBOARDLISTENER)
 };
 
+// API function that darkens or undarkens the screen.
+class AccessibilityPrivateDarkenScreenFunction
+    : public UIThreadExtensionFunction {
+  ~AccessibilityPrivateDarkenScreenFunction() override {}
+  ResponseAction Run() override;
+  DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.darkenScreen",
+                             ACCESSIBILITY_PRIVATE_DARKENSCREEN)
+};
+
 #endif  // CHROME_BROWSER_ACCESSIBILITY_ACCESSIBILITY_EXTENSION_API_H_
diff --git a/chrome/browser/android/ntp/content_suggestions_notifier_service.cc b/chrome/browser/android/ntp/content_suggestions_notifier_service.cc
index a7367ab..af16293 100644
--- a/chrome/browser/android/ntp/content_suggestions_notifier_service.cc
+++ b/chrome/browser/android/ntp/content_suggestions_notifier_service.cc
@@ -104,8 +104,7 @@
 class ContentSuggestionsNotifierService::NotifyingObserver
     : public ContentSuggestionsService::Observer {
  public:
-  NotifyingObserver(ContentSuggestionsService* service,
-                    Profile* profile)
+  NotifyingObserver(ContentSuggestionsService* service, Profile* profile)
       : service_(service),
         profile_(profile),
         app_status_listener_(base::Bind(&NotifyingObserver::AppStatusChanged,
diff --git a/chrome/browser/android/ntp/most_visited_sites_bridge.cc b/chrome/browser/android/ntp/most_visited_sites_bridge.cc
index 96f3784b..5363485 100644
--- a/chrome/browser/android/ntp/most_visited_sites_bridge.cc
+++ b/chrome/browser/android/ntp/most_visited_sites_bridge.cc
@@ -97,8 +97,8 @@
 
 MostVisitedSitesBridge::~MostVisitedSitesBridge() {}
 
-void MostVisitedSitesBridge::Destroy(
-    JNIEnv* env, const JavaParamRef<jobject>& obj) {
+void MostVisitedSitesBridge::Destroy(JNIEnv* env,
+                                     const JavaParamRef<jobject>& obj) {
   delete this;
 }
 
@@ -169,7 +169,6 @@
                   const JavaParamRef<jobject>& obj,
                   const JavaParamRef<jobject>& jprofile) {
   MostVisitedSitesBridge* most_visited_sites =
-      new MostVisitedSitesBridge(
-          ProfileAndroid::FromProfileAndroid(jprofile));
+      new MostVisitedSitesBridge(ProfileAndroid::FromProfileAndroid(jprofile));
   return reinterpret_cast<intptr_t>(most_visited_sites);
 }
diff --git a/chrome/browser/android/ntp/ntp_snippets_bridge.cc b/chrome/browser/android/ntp/ntp_snippets_bridge.cc
index 928aaf08..8780ce1 100644
--- a/chrome/browser/android/ntp/ntp_snippets_bridge.cc
+++ b/chrome/browser/android/ntp/ntp_snippets_bridge.cc
@@ -164,9 +164,8 @@
   Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
   content_suggestions_service_ =
       ContentSuggestionsServiceFactory::GetForProfile(profile);
-  history_service_ =
-      HistoryServiceFactory::GetForProfile(profile,
-                                           ServiceAccessType::EXPLICIT_ACCESS);
+  history_service_ = HistoryServiceFactory::GetForProfile(
+      profile, ServiceAccessType::EXPLICIT_ACCESS);
   content_suggestions_service_observer_.Add(content_suggestions_service_);
 }
 
@@ -243,15 +242,16 @@
 
   Category category = Category::FromIDValue(j_category_id);
   content_suggestions_service_->Fetch(
-      category, std::set<std::string>(known_suggestion_ids.begin(),
-                                      known_suggestion_ids.end()),
+      category,
+      std::set<std::string>(known_suggestion_ids.begin(),
+                            known_suggestion_ids.end()),
       base::Bind(&NTPSnippetsBridge::OnSuggestionsFetched,
                  weak_ptr_factory_.GetWeakPtr(), category));
 }
 
 void NTPSnippetsBridge::ReloadSuggestions(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj) {
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
   content_suggestions_service_->ReloadSuggestions();
 }
 
diff --git a/chrome/browser/android/ntp/ntp_snippets_bridge.h b/chrome/browser/android/ntp/ntp_snippets_bridge.h
index 78dc3ff..be7f42f 100644
--- a/chrome/browser/android/ntp/ntp_snippets_bridge.h
+++ b/chrome/browser/android/ntp/ntp_snippets_bridge.h
@@ -66,9 +66,8 @@
       jint j_category_id,
       const base::android::JavaParamRef<jobjectArray>& j_displayed_suggestions);
 
-  void ReloadSuggestions(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  void ReloadSuggestions(JNIEnv* env,
+                         const base::android::JavaParamRef<jobject>& obj);
 
   void DismissSuggestion(
       JNIEnv* env,
diff --git a/chrome/browser/android/ntp/ntp_snippets_launcher.h b/chrome/browser/android/ntp/ntp_snippets_launcher.h
index a043e5a..002b6e7 100644
--- a/chrome/browser/android/ntp/ntp_snippets_launcher.h
+++ b/chrome/browser/android/ntp/ntp_snippets_launcher.h
@@ -14,8 +14,7 @@
 // Android implementation of ntp_snippets::NTPSnippetsScheduler.
 // The NTPSnippetsLauncher singleton owns the Java SnippetsLauncher object, and
 // is used to schedule the fetching of snippets. Runs on the UI thread.
-class NTPSnippetsLauncher
-    : public ntp_snippets::PersistentScheduler {
+class NTPSnippetsLauncher : public ntp_snippets::PersistentScheduler {
  public:
   static NTPSnippetsLauncher* Get();
 
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 5ec7f98..44c2e7a 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -85,7 +85,6 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/common/switch_utils.h"
 #include "chrome/common/url_constants.h"
-#include "chrome/installer/util/google_update_constants.h"
 #include "chrome/installer/util/google_update_settings.h"
 #include "components/component_updater/component_updater_service.h"
 #include "components/gcm_driver/gcm_driver.h"
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index bce9863..6f4e6650 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -53,6 +53,7 @@
 #include "chrome/browser/nacl_host/nacl_browser_delegate_impl.h"
 #include "chrome/browser/net_benchmarking.h"
 #include "chrome/browser/notifications/platform_notification_service_impl.h"
+#include "chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.h"
 #include "chrome/browser/page_load_metrics/metrics_navigation_throttle.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/permissions/permission_context_base.h"
@@ -195,7 +196,6 @@
 #include "ppapi/features/features.h"
 #include "ppapi/host/ppapi_host.h"
 #include "printing/features/features.h"
-#include "services/image_decoder/public/interfaces/constants.mojom.h"
 #include "services/preferences/public/interfaces/preferences.mojom.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "services/service_manager/public/cpp/interface_registry.h"
@@ -3254,8 +3254,6 @@
   services->insert(std::make_pair("media",
                                   base::ASCIIToUTF16("Media Service")));
 #endif
-  services->insert(std::make_pair(image_decoder::mojom::kServiceName,
-                                  base::ASCIIToUTF16("Image Decoder Service")));
 }
 
 std::unique_ptr<base::Value>
@@ -3359,6 +3357,16 @@
     content::NavigationHandle* handle) {
   std::vector<std::unique_ptr<content::NavigationThrottle>> throttles;
 
+  // MetricsNavigationThrottle requires that it runs before NavigationThrottles
+  // that may delay or cancel navigations, so only NavigationThrottles that
+  // don't delay or cancel navigations (e.g. throttles that are only observing
+  // callbacks without affecting navigation behavior) should be added before
+  // MetricsNavigationThrottle.
+  if (handle->IsInMainFrame()) {
+    throttles.push_back(
+        page_load_metrics::MetricsNavigationThrottle::Create(handle));
+  }
+
 #if BUILDFLAG(ENABLE_PLUGINS)
   std::unique_ptr<content::NavigationThrottle> flash_url_throttle =
       FlashDownloadInterception::MaybeCreateThrottleFor(handle);
@@ -3366,11 +3374,6 @@
     throttles.push_back(std::move(flash_url_throttle));
 #endif
 
-  if (handle->IsInMainFrame()) {
-    throttles.push_back(
-        page_load_metrics::MetricsNavigationThrottle::Create(handle));
-  }
-
 #if defined(OS_ANDROID)
   // TODO(davidben): This is insufficient to integrate with prerender properly.
   // https://crbug.com/370595
@@ -3426,6 +3429,11 @@
       base::MakeUnique<extensions::ExtensionNavigationThrottle>(handle));
 #endif
 
+  std::unique_ptr<content::NavigationThrottle> delay_navigation_throttle =
+      DelayNavigationThrottle::MaybeCreateThrottleFor(handle);
+  if (delay_navigation_throttle)
+    throttles.push_back(std::move(delay_navigation_throttle));
+
   return throttles;
 }
 
diff --git a/chrome/browser/chrome_content_browser_manifest_overlay.json b/chrome/browser/chrome_content_browser_manifest_overlay.json
index 8b3d927..591866ac 100644
--- a/chrome/browser/chrome_content_browser_manifest_overlay.json
+++ b/chrome/browser/chrome_content_browser_manifest_overlay.json
@@ -24,12 +24,11 @@
         "accessibility_autoclick": [ "ash:autoclick" ],
         "ash": [ "ash" ],
         "identity": [ "identity_manager" ],
-        "image_decoder": [ "decode" ],
         "nacl_broker": [ "browser" ],
         "nacl_loader": [ "browser" ],
         "preferences": [ "preferences_manager" ],
         "preferences2": [ "pref_client" ],
-        "ui": [ "display_controller", "ime_registrar" ]
+        "ui": [ "display_controller", "ime_registrar", "window_manager" ]
       }
     },
     "navigation:frame": {
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager.cc b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
index 9ade269..8ee1140 100644
--- a/chrome/browser/chromeos/accessibility/accessibility_manager.cc
+++ b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
@@ -58,6 +58,8 @@
 #include "chrome/grit/browser_resources.h"
 #include "chromeos/audio/audio_a11y_controller.h"
 #include "chromeos/audio/chromeos_sounds.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/power_manager_client.h"
 #include "components/prefs/pref_member.h"
 #include "components/prefs/pref_service.h"
 #include "components/session_manager/core/session_manager.h"
@@ -1380,6 +1382,11 @@
     chromevox_panel_->Close();
     chromevox_panel_ = nullptr;
   }
+
+  // In case the user darkened the screen, undarken it now.
+  chromeos::DBusThreadManager::Get()
+      ->GetPowerManagerClient()
+      ->SetBacklightsForcedOff(false);
 }
 
 void AccessibilityManager::PostSwitchChromeVoxProfile() {
diff --git a/chrome/browser/chromeos/net/DEPS b/chrome/browser/chromeos/net/DEPS
index 3da1b0c0..eab43d8 100644
--- a/chrome/browser/chromeos/net/DEPS
+++ b/chrome/browser/chromeos/net/DEPS
@@ -10,7 +10,7 @@
   "network_portal_notification_controller\.cc": [
     "+ash/common/system/system_notifier.h",
     "+ash/common/system/tray/system_tray_notifier.h",
-    "+ash/common/wm_shell.h",
+    "+ash/shell.h",
   ],
   "network_state_notifier\.cc": [
     "+ash/common/system/system_notifier.h",
diff --git a/chrome/browser/chromeos/net/network_portal_notification_controller.cc b/chrome/browser/chromeos/net/network_portal_notification_controller.cc
index a25aaa2..93b3a32 100644
--- a/chrome/browser/chromeos/net/network_portal_notification_controller.cc
+++ b/chrome/browser/chromeos/net/network_portal_notification_controller.cc
@@ -11,7 +11,7 @@
 
 #include "ash/common/system/system_notifier.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 #include "base/command_line.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
@@ -300,8 +300,8 @@
     return;
   last_network_guid_ = network->guid();
 
-  if (ash::WmShell::HasInstance()) {
-    ash::WmShell::Get()->system_tray_notifier()->NotifyOnCaptivePortalDetected(
+  if (ash::Shell::HasInstance()) {
+    ash::Shell::Get()->system_tray_notifier()->NotifyOnCaptivePortalDetected(
         network->guid());
   }
 
diff --git a/chrome/browser/chromeos/ui/screen_capture_notification_ui_chromeos.cc b/chrome/browser/chromeos/ui/screen_capture_notification_ui_chromeos.cc
index f3d3c09..b4614c3 100644
--- a/chrome/browser/chromeos/ui/screen_capture_notification_ui_chromeos.cc
+++ b/chrome/browser/chromeos/ui/screen_capture_notification_ui_chromeos.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/chromeos/ui/screen_capture_notification_ui_chromeos.h"
 
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 
 namespace chromeos {
 
@@ -17,12 +17,12 @@
 ScreenCaptureNotificationUIChromeOS::~ScreenCaptureNotificationUIChromeOS() {
   // MediaStreamCaptureIndicator will delete ScreenCaptureNotificationUI object
   // after it stops screen capture.
-  ash::WmShell::Get()->system_tray_notifier()->NotifyScreenCaptureStop();
+  ash::Shell::Get()->system_tray_notifier()->NotifyScreenCaptureStop();
 }
 
 gfx::NativeViewId ScreenCaptureNotificationUIChromeOS::OnStarted(
     const base::Closure& stop_callback) {
-  ash::WmShell::Get()->system_tray_notifier()->NotifyScreenCaptureStart(
+  ash::Shell::Get()->system_tray_notifier()->NotifyScreenCaptureStart(
       stop_callback, text_);
   return 0;
 }
diff --git a/chrome/browser/extensions/app_background_page_apitest.cc b/chrome/browser/extensions/app_background_page_apitest.cc
index 78ce135..2ac5033 100644
--- a/chrome/browser/extensions/app_background_page_apitest.cc
+++ b/chrome/browser/extensions/app_background_page_apitest.cc
@@ -122,9 +122,6 @@
 
   void SetUpOnMainThread() override {
     AppBackgroundPageApiTest::SetUpOnMainThread();
-#if !defined(DISABLE_NACL)
-    nacl::NaClProcessHost::SetPpapiKeepAliveThrottleForTesting(50);
-#endif
     extensions::ProcessManager::SetEventPageIdleTimeForTesting(1000);
     extensions::ProcessManager::SetEventPageSuspendingTimeForTesting(1000);
   }
@@ -145,56 +142,6 @@
   const Extension* extension_;
 };
 
-// Produces an extensions::ProcessManager::ImpulseCallbackForTesting callback
-// that will match a specified goal and can be waited on.
-class ImpulseCallbackCounter {
- public:
-  explicit ImpulseCallbackCounter(extensions::ProcessManager* manager,
-                                  const std::string& extension_id)
-      : observed_(0),
-        goal_(0),
-        manager_(manager),
-        extension_id_(extension_id) {
-  }
-
-  extensions::ProcessManager::ImpulseCallbackForTesting
-      SetGoalAndGetCallback(int goal) {
-    observed_ = 0;
-    goal_ = goal;
-    message_loop_runner_ = new content::MessageLoopRunner();
-    return base::Bind(&ImpulseCallbackCounter::ImpulseCallback,
-                      base::Unretained(this),
-                      message_loop_runner_->QuitClosure(),
-                      extension_id_);
-  }
-
-  void Wait() {
-    message_loop_runner_->Run();
-  }
- private:
-  void ImpulseCallback(
-      const base::Closure& quit_callback,
-      const std::string& extension_id_from_test,
-      const std::string& extension_id_from_manager) {
-    if (extension_id_from_test == extension_id_from_manager) {
-      if (++observed_ >= goal_) {
-        // Clear callback to free reference to message loop.
-        manager_->SetKeepaliveImpulseCallbackForTesting(
-            extensions::ProcessManager::ImpulseCallbackForTesting());
-        manager_->SetKeepaliveImpulseDecrementCallbackForTesting(
-            extensions::ProcessManager::ImpulseCallbackForTesting());
-        quit_callback.Run();
-      }
-    }
-  }
-
-  int observed_;
-  int goal_;
-  extensions::ProcessManager* manager_;
-  const std::string extension_id_;
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
-};
-
 }  // namespace
 
 // Disable on Mac only.  http://crbug.com/95139
@@ -592,54 +539,63 @@
   ASSERT_TRUE(WaitForBackgroundMode(false));
 }
 
-// Verify active NaCl embeds cause many keepalive impulses to be sent.
-// Disabled on Windows due to flakiness: http://crbug.com/346278
-#if defined(OS_WIN)
-#define MAYBE_BackgroundKeepaliveActive DISABLED_BackgroundKeepaliveActive
-#else
-// Disabling other platforms too since the test started failing
-// consistently. http://crbug.com/490440
-#define MAYBE_BackgroundKeepaliveActive DISABLED_BackgroundKeepaliveActive
-#endif
-IN_PROC_BROWSER_TEST_F(AppBackgroundPageNaClTest,
-                       MAYBE_BackgroundKeepaliveActive) {
 #if !defined(DISABLE_NACL)
-  ExtensionTestMessageListener nacl_modules_loaded("nacl_modules_loaded", true);
-  LaunchTestingApp();
+
+// Verify that active NaCl embeds raise the keepalive count.
+IN_PROC_BROWSER_TEST_F(AppBackgroundPageNaClTest, BackgroundKeepaliveActive) {
   extensions::ProcessManager* manager =
       extensions::ProcessManager::Get(browser()->profile());
-  ImpulseCallbackCounter active_impulse_counter(manager, extension()->id());
-  EXPECT_TRUE(nacl_modules_loaded.WaitUntilSatisfied());
-
-  // Target .5 seconds: .5 seconds / 50ms throttle * 2 embeds == 20 impulses.
-  manager->SetKeepaliveImpulseCallbackForTesting(
-      active_impulse_counter.SetGoalAndGetCallback(20));
-  active_impulse_counter.Wait();
-#endif
-}
-
-// Verify that nacl modules that go idle will not send keepalive impulses.
-// Disabled on windows due to Win XP failures:
-// DesktopWindowTreeHostWin::HandleCreate not implemented. crbug.com/331954
-#if defined(OS_WIN)
-#define MAYBE_BackgroundKeepaliveIdle DISABLED_BackgroundKeepaliveIdle
-#else
-// ASAN errors appearing: https://crbug.com/332440
-#define MAYBE_BackgroundKeepaliveIdle DISABLED_BackgroundKeepaliveIdle
-#endif
-IN_PROC_BROWSER_TEST_F(AppBackgroundPageNaClTest,
-                       MAYBE_BackgroundKeepaliveIdle) {
-#if !defined(DISABLE_NACL)
-  ExtensionTestMessageListener nacl_modules_loaded("nacl_modules_loaded", true);
+  ExtensionTestMessageListener ready_listener("ready", true);
   LaunchTestingApp();
-  extensions::ProcessManager* manager =
-      extensions::ProcessManager::Get(browser()->profile());
-  ImpulseCallbackCounter idle_impulse_counter(manager, extension()->id());
-  EXPECT_TRUE(nacl_modules_loaded.WaitUntilSatisfied());
+  EXPECT_TRUE(ready_listener.WaitUntilSatisfied());
 
-  manager->SetKeepaliveImpulseDecrementCallbackForTesting(
-      idle_impulse_counter.SetGoalAndGetCallback(1));
-  nacl_modules_loaded.Reply("be idle");
-  idle_impulse_counter.Wait();
-#endif
+  // When the app calls chrome.test.sendMessage() the keepalive count stays
+  // incremented until the call completes (i.e. until we call Reply() below).
+  // So between WaitUntilSatisfied() and Reply(), we know that the count must
+  // be in the incremented state, and in this case that is the only
+  // contributor to the keepalive count.
+  EXPECT_EQ(1, manager->GetLazyKeepaliveCount(extension()));
+
+  ExtensionTestMessageListener created1_listener("created_module:1", true);
+  ready_listener.Reply("create_module");
+  EXPECT_TRUE(created1_listener.WaitUntilSatisfied());
+
+  // Now chrome.test.sendMessage() is incrementing the keepalive count, but
+  // there is also a Native Client module active, incrementing it again.
+  EXPECT_EQ(2, manager->GetLazyKeepaliveCount(extension()));
+
+  ExtensionTestMessageListener created2_listener("created_module:2", true);
+  created1_listener.Reply("create_module");
+  EXPECT_TRUE(created2_listener.WaitUntilSatisfied());
+
+  // Keepalive comes from chrome.test.sendMessage, plus two modules.
+  EXPECT_EQ(3, manager->GetLazyKeepaliveCount(extension()));
+
+  // Tear-down both modules.
+  ExtensionTestMessageListener destroyed1_listener("destroyed_module", true);
+  created2_listener.Reply("destroy_module");
+  EXPECT_TRUE(destroyed1_listener.WaitUntilSatisfied());
+  ExtensionTestMessageListener destroyed2_listener("destroyed_module", false);
+  destroyed1_listener.Reply("destroy_module");
+  EXPECT_TRUE(destroyed2_listener.WaitUntilSatisfied());
+
+  // Both modules are gone, and no sendMessage API reply is pending (since the
+  // last listener has the |will_reply| flag set to |false|).
+  EXPECT_EQ(0, manager->GetLazyKeepaliveCount(extension()));
 }
+
+// Verify that we can create a NaCl module by adding the <embed> to the
+// background page, without having to e.g. touch emebed.lastError to
+// trigger the module to load.
+// Disabled due to http://crbug.com/371059.
+IN_PROC_BROWSER_TEST_F(AppBackgroundPageNaClTest, DISABLED_CreateNaClModule) {
+  ExtensionTestMessageListener ready_listener("ready", true);
+  LaunchTestingApp();
+  EXPECT_TRUE(ready_listener.WaitUntilSatisfied());
+
+  ExtensionTestMessageListener created_listener("created_module:1", false);
+  ready_listener.Reply("create_module_without_hack");
+  EXPECT_TRUE(created_listener.WaitUntilSatisfied());
+}
+
+#endif  //  !defined(DISABLE_NACL)
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
index 1a5845d..b76e1dc5 100644
--- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
+++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
@@ -151,36 +151,45 @@
   return PRIV_EXTENSION;
 }
 
-// Determines whether the extension |origin| passed in can be committed by
-// the process identified by |child_id| and returns true or false
-// accordingly. Please refer to the implementation for more information.
-bool IsIllegalOrigin(content::ResourceContext* resource_context,
-                     int child_id,
-                     const GURL& origin) {
+// Determines whether the extension |origin| is legal to use in an Origin header
+// from the process identified by |child_id|.  Returns CONTINUE if so, FAIL if
+// the extension is not recognized (and may recently have been uninstalled), and
+// KILL if the origin is from a platform app but the request does not come from
+// that app.
+content::HeaderInterceptorResult CheckOriginHeader(
+    content::ResourceContext* resource_context,
+    int child_id,
+    const GURL& origin) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   // Consider non-extension URLs safe; they will be checked elsewhere.
   if (!origin.SchemeIs(kExtensionScheme))
-    return false;
+    return content::HeaderInterceptorResult::CONTINUE;
 
-  // If there is no extension installed for the URL, it couldn't have committed.
-  // (If the extension was recently uninstalled, the tab would have closed.)
+  // If there is no extension installed for the origin, it may be from a
+  // recently uninstalled extension.  The tabs of such extensions are
+  // automatically closed, but subframes and content scripts may stick around.
+  // Fail such requests without killing the process.
+  // TODO(rdevlin.cronin, creis): Track which extensions have been uninstalled
+  // and use HeaderInterceptorResult::KILL for anything not on the list.
+  // See https://crbug.com/705128.
   ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
   InfoMap* extension_info_map = io_data->GetExtensionInfoMap();
   const Extension* extension =
       extension_info_map->extensions().GetExtensionOrAppByURL(origin);
   if (!extension)
-    return true;
+    return content::HeaderInterceptorResult::FAIL;
 
   // Check for platform app origins.  These can only be committed by the app
   // itself, or by one if its guests if there are accessible_resources.
+  // Processes that incorrectly claim to be an app should be killed.
   const ProcessMap& process_map = extension_info_map->process_map();
   if (extension->is_platform_app() &&
       !process_map.Contains(extension->id(), child_id)) {
     // This is a platform app origin not in the app's own process.  If there
     // are no accessible resources, this is illegal.
     if (!extension->GetManifestData(manifest_keys::kWebviewAccessibleResources))
-      return true;
+      return content::HeaderInterceptorResult::KILL;
 
     // If there are accessible resources, the origin is only legal if the
     // given process is a guest of the app.
@@ -190,18 +199,22 @@
         child_id, &owner_process_id, &owner_extension_id);
     const Extension* owner_extension =
         extension_info_map->extensions().GetByID(owner_extension_id);
-    return !owner_extension || owner_extension != extension;
+    if (!owner_extension || owner_extension != extension)
+      return content::HeaderInterceptorResult::KILL;
+
+    // It's a valid guest of the app, so allow it to proceed.
+    return content::HeaderInterceptorResult::CONTINUE;
   }
 
   // With only the origin and not the full URL, we don't have enough
   // information to validate hosted apps or web_accessible_resources in normal
   // extensions. Assume they're legal.
-  return false;
+  return content::HeaderInterceptorResult::CONTINUE;
 }
 
 // This callback is registered on the ResourceDispatcherHost for the chrome
 // extension Origin scheme. We determine whether the extension origin is
-// valid. Please see the IsIllegalOrigin() function.
+// valid. Please see the CheckOriginHeader() function.
 void OnHttpHeaderReceived(const std::string& header,
                           const std::string& value,
                           int child_id,
@@ -212,12 +225,7 @@
   GURL origin(value);
   DCHECK(origin.SchemeIs(extensions::kExtensionScheme));
 
-  if (IsIllegalOrigin(resource_context, child_id, origin)) {
-    // TODO(ananta): Find a way to specify the right error code here.
-    callback.Run(false, 0);
-  } else {
-    callback.Run(true, 0);
-  }
+  callback.Run(CheckOriginHeader(resource_context, child_id, origin));
 }
 
 void RecordShowAllowOpenURLFailure(ShouldAllowOpenURLFailureReason reason) {
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index 53a9677c..b8f708f 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -49,6 +49,7 @@
 #include "extensions/browser/install/extension_install_ui.h"
 #include "extensions/browser/install_flag.h"
 #include "extensions/browser/notification_types.h"
+#include "extensions/browser/preload_check.h"
 #include "extensions/common/extension_icon_set.h"
 #include "extensions/common/file_util.h"
 #include "extensions/common/manifest.h"
@@ -539,12 +540,13 @@
   }
 
   // Check the blacklist state.
-  if (install_checker_->blacklist_state() == BLACKLISTED_MALWARE) {
+  if (install_checker_->blacklist_error() == PreloadCheck::BLACKLISTED_ID) {
     install_flags_ |= kInstallFlagIsBlacklistedForMalware;
   }
 
-  if ((install_checker_->blacklist_state() == BLACKLISTED_MALWARE ||
-       install_checker_->blacklist_state() == BLACKLISTED_UNKNOWN) &&
+  if ((install_checker_->blacklist_error() == PreloadCheck::BLACKLISTED_ID ||
+       install_checker_->blacklist_error() ==
+           PreloadCheck::BLACKLISTED_UNKNOWN) &&
       !allow_silent_install_) {
     // User tried to install a blacklisted extension. Show an error and
     // refuse to install it.
diff --git a/chrome/browser/extensions/crx_installer.h b/chrome/browser/extensions/crx_installer.h
index e16d57c..9f73dd3 100644
--- a/chrome/browser/extensions/crx_installer.h
+++ b/chrome/browser/extensions/crx_installer.h
@@ -243,10 +243,6 @@
   // Runs on the UI thread. Callback from ExtensionInstallChecker.
   void OnInstallChecksComplete(int failed_checks);
 
-  // Runs on the UI thread. Callback from Blacklist.
-  void OnBlacklistChecked(
-      extensions::BlacklistState blacklist_state);
-
   // Runs on the UI thread. Confirms the installation to the ExtensionService.
   void ConfirmInstall();
 
diff --git a/chrome/browser/extensions/extension_install_checker.cc b/chrome/browser/extensions/extension_install_checker.cc
index d027389d..8117973 100644
--- a/chrome/browser/extensions/extension_install_checker.cc
+++ b/chrome/browser/extensions/extension_install_checker.cc
@@ -4,14 +4,17 @@
 
 #include "chrome/browser/extensions/extension_install_checker.h"
 
+#include "base/bind_helpers.h"
 #include "base/callback_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/extensions/blacklist.h"
+#include "chrome/browser/extensions/blacklist_check.h"
 #include "chrome/browser/extensions/chrome_requirements_checker.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/extension_system.h"
-#include "extensions/browser/management_policy.h"
+#include "extensions/browser/policy_check.h"
 
 namespace extensions {
 
@@ -22,8 +25,6 @@
     bool fail_fast)
     : profile_(profile),
       extension_(extension),
-      blacklist_state_(NOT_BLACKLISTED),
-      policy_allows_load_(true),
       enabled_checks_(enabled_checks),
       running_checks_(0),
       fail_fast_(fail_fast),
@@ -69,28 +70,26 @@
 }
 
 void ExtensionInstallChecker::CheckManagementPolicy() {
-  DCHECK(extension_.get());
-
-  base::string16 error;
-  bool allow = ExtensionSystem::Get(profile_)->management_policy()->UserMayLoad(
-      extension_.get(), &error);
-  OnManagementPolicyCheckDone(allow, base::UTF16ToUTF8(error));
+  // In tests, this check may already be stubbed.
+  if (!policy_check_)
+    policy_check_ = base::MakeUnique<PolicyCheck>(profile_, extension_.get());
+  policy_check_->Start(
+      base::BindOnce(&ExtensionInstallChecker::OnManagementPolicyCheckDone,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
 void ExtensionInstallChecker::OnManagementPolicyCheckDone(
-    bool allows_load,
-    const std::string& error) {
-  policy_allows_load_ = allows_load;
-  policy_error_ = error;
-  DCHECK(policy_allows_load_ || !policy_error_.empty());
+    PreloadCheck::Errors errors) {
+  if (!errors.empty()) {
+    DCHECK_EQ(1u, errors.count(PreloadCheck::DISALLOWED_BY_POLICY));
+    policy_error_ = base::UTF16ToUTF8(policy_check_->GetErrorMessage());
+  }
 
   running_checks_ &= ~CHECK_MANAGEMENT_POLICY;
   MaybeInvokeCallback();
 }
 
 void ExtensionInstallChecker::CheckRequirements() {
-  DCHECK(extension_.get());
-
   requirements_checker_ = base::MakeUnique<ChromeRequirementsChecker>();
   requirements_checker_->Check(
       extension_, base::Bind(&ExtensionInstallChecker::OnRequirementsCheckDone,
@@ -108,19 +107,26 @@
 }
 
 void ExtensionInstallChecker::CheckBlacklistState() {
-  DCHECK(extension_.get());
-
-  extensions::Blacklist* blacklist = Blacklist::Get(profile_);
-  blacklist->IsBlacklisted(
-      extension_->id(),
-      base::Bind(&ExtensionInstallChecker::OnBlacklistStateCheckDone,
-                 weak_ptr_factory_.GetWeakPtr()));
+  // In tests, this check may already be stubbed.
+  if (!blacklist_check_) {
+    blacklist_check_ = base::MakeUnique<BlacklistCheck>(
+        Blacklist::Get(profile_), extension_.get());
+  }
+  blacklist_check_->Start(
+      base::BindOnce(&ExtensionInstallChecker::OnBlacklistStateCheckDone,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
-void ExtensionInstallChecker::OnBlacklistStateCheckDone(BlacklistState state) {
+void ExtensionInstallChecker::OnBlacklistStateCheckDone(
+    PreloadCheck::Errors errors) {
   DCHECK(is_running());
 
-  blacklist_state_ = state;
+  if (errors.empty()) {
+    blacklist_error_ = PreloadCheck::NONE;
+  } else {
+    DCHECK_EQ(1u, errors.size());
+    blacklist_error_ = *errors.begin();
+  }
 
   running_checks_ &= ~CHECK_BLACKLIST;
   MaybeInvokeCallback();
@@ -132,19 +138,23 @@
 
   // Set bits for failed checks.
   int failed_mask = 0;
-  if (blacklist_state_ == BLACKLISTED_MALWARE)
+  if (blacklist_error_ == PreloadCheck::BLACKLISTED_ID)
     failed_mask |= CHECK_BLACKLIST;
   if (!requirement_errors_.empty())
     failed_mask |= CHECK_REQUIREMENTS;
-  if (!policy_allows_load_)
+  if (!policy_error_.empty())
     failed_mask |= CHECK_MANAGEMENT_POLICY;
 
   // Invoke callback if all checks are complete or there was at least one
   // failure and |fail_fast_| is true.
   if (!is_running() || (failed_mask && fail_fast_)) {
-    // If we are failing fast, discard any pending results.
-    weak_ptr_factory_.InvalidateWeakPtrs();
     running_checks_ = 0;
+
+    // If we are failing fast, discard any pending results.
+    blacklist_check_.reset();
+    policy_check_.reset();
+    requirements_checker_.reset();
+    weak_ptr_factory_.InvalidateWeakPtrs();
     base::ResetAndReturn(&callback_).Run(failed_mask);
   }
 }
diff --git a/chrome/browser/extensions/extension_install_checker.h b/chrome/browser/extensions/extension_install_checker.h
index 9bafea51..17da2427 100644
--- a/chrome/browser/extensions/extension_install_checker.h
+++ b/chrome/browser/extensions/extension_install_checker.h
@@ -13,7 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string16.h"
-#include "extensions/browser/blacklist_state.h"
+#include "extensions/browser/preload_check.h"
 #include "extensions/common/extension.h"
 
 class Profile;
@@ -66,43 +66,49 @@
     return requirement_errors_;
   }
 
-  // Returns the blacklist state of the extension. A blacklist state of
-  // BLACKLISTED_MALWARE is considered to be a check failure.
-  BlacklistState blacklist_state() const { return blacklist_state_; }
+  // Returns the blacklist error of the extension. Note that there is only an
+  // error if the BlacklistState is BLACKLISTED_MALWARE or BLACKLISTED_UNKNOWN.
+  PreloadCheck::Error blacklist_error() const { return blacklist_error_; }
 
   // Returns whether management policy permits installation of the extension.
-  bool policy_allows_load() const { return policy_allows_load_; }
   const std::string& policy_error() const { return policy_error_; }
 
+  void SetBlacklistCheckForTesting(std::unique_ptr<PreloadCheck> policy_check) {
+    blacklist_check_ = std::move(policy_check);
+  }
+  void SetPolicyCheckForTesting(std::unique_ptr<PreloadCheck> policy_check) {
+    policy_check_ = std::move(policy_check);
+  }
+
  protected:
   virtual void CheckManagementPolicy();
-  void OnManagementPolicyCheckDone(bool allows_load, const std::string& error);
+  void OnManagementPolicyCheckDone(PreloadCheck::Errors errors);
 
   virtual void CheckRequirements();
   void OnRequirementsCheckDone(const std::vector<std::string>& errors);
 
   virtual void CheckBlacklistState();
-  void OnBlacklistStateCheckDone(BlacklistState state);
+  void OnBlacklistStateCheckDone(PreloadCheck::Errors errors);
 
  private:
   void MaybeInvokeCallback();
 
-  std::unique_ptr<RequirementsChecker> requirements_checker_;
-
   // The Profile where the extension is being installed in.
   Profile* profile_;
 
   // The extension to run checks for.
   scoped_refptr<const Extension> extension_;
 
-  // Requirement violations.
+  // Checks requirements specified in the manifest.
+  std::unique_ptr<RequirementsChecker> requirements_checker_;
   std::vector<std::string> requirement_errors_;
 
-  // Result of the blacklist state check.
-  BlacklistState blacklist_state_;
+  // Checks if the extension is blacklisted.
+  std::unique_ptr<PreloadCheck> blacklist_check_;
+  PreloadCheck::Error blacklist_error_ = PreloadCheck::NONE;
 
-  // Whether the extension can be installed, according to management policies.
-  bool policy_allows_load_;
+  // Checks whether management policies allow the extension to be installed.
+  std::unique_ptr<PreloadCheck> policy_check_;
   std::string policy_error_;
 
   // Bitmask of enabled checks.
diff --git a/chrome/browser/extensions/extension_install_checker_unittest.cc b/chrome/browser/extensions/extension_install_checker_unittest.cc
index fb6b9e6..36307ff 100644
--- a/chrome/browser/extensions/extension_install_checker_unittest.cc
+++ b/chrome/browser/extensions/extension_install_checker_unittest.cc
@@ -2,19 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/extensions/extension_install_checker.h"
+
 #include "base/bind.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/extensions/extension_install_checker.h"
+#include "extensions/browser/preload_check_test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace extensions {
 
 namespace {
 
-const BlacklistState kBlacklistStateError = BLACKLISTED_MALWARE;
+const PreloadCheck::Error kBlacklistError = PreloadCheck::BLACKLISTED_ID;
 const char kDummyRequirementsError[] = "Requirements error";
 const char kDummyPolicyError[] = "Cannot install extension";
 
@@ -26,26 +30,18 @@
 class ExtensionInstallCheckerForTest : public ExtensionInstallChecker {
  public:
   ExtensionInstallCheckerForTest(int enabled_checks, bool fail_fast)
-      : ExtensionInstallChecker(nullptr, nullptr, enabled_checks, fail_fast),
-        requirements_check_called_(false),
-        blacklist_check_called_(false),
-        policy_check_called_(false),
-        blacklist_state_(NOT_BLACKLISTED) {}
+      : ExtensionInstallChecker(nullptr, nullptr, enabled_checks, fail_fast) {}
 
   ~ExtensionInstallCheckerForTest() override {}
 
   void set_requirements_error(const std::string& error) {
     requirements_error_ = error;
   }
-  void set_policy_check_error(const std::string& error) {
-    policy_check_error_ = error;
-  }
-  void set_blacklist_state(BlacklistState state) { blacklist_state_ = state; }
 
-  bool requirements_check_called() const { return requirements_check_called_; }
-  bool blacklist_check_called() const { return blacklist_check_called_; }
-  bool policy_check_called() const { return policy_check_called_; }
+  bool is_async() const { return is_async_; }
+  void set_is_async(bool is_async) { is_async_ = is_async; }
 
+ protected:
   void MockCheckRequirements() {
     if (!is_running())
       return;
@@ -55,64 +51,24 @@
     OnRequirementsCheckDone(errors);
   }
 
-  void MockCheckBlacklistState() {
-    if (!is_running())
-      return;
-    OnBlacklistStateCheckDone(blacklist_state_);
-  }
-
- protected:
   void CheckRequirements() override {
-    requirements_check_called_ = true;
-    MockCheckRequirements();
+    if (is_async_) {
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE,
+          base::Bind(&ExtensionInstallCheckerForTest::MockCheckRequirements,
+                     base::Unretained(this)));
+    } else {
+      MockCheckRequirements();
+    }
   }
 
-  void CheckManagementPolicy() override {
-    policy_check_called_ = true;
-    OnManagementPolicyCheckDone(policy_check_error_.empty(),
-                                policy_check_error_);
-  }
+ private:
+  // Whether to run the requirements and blacklist checks asynchronously, as
+  // they often do in ExtensionInstallChecker.
+  bool is_async_ = false;
 
-  void CheckBlacklistState() override {
-    blacklist_check_called_ = true;
-    MockCheckBlacklistState();
-  }
-
-  bool requirements_check_called_;
-  bool blacklist_check_called_;
-  bool policy_check_called_;
-
-  // Dummy errors for testing.
+  // Dummy error for testing.
   std::string requirements_error_;
-  std::string policy_check_error_;
-  BlacklistState blacklist_state_;
-};
-
-// This class implements asynchronous mocks of the requirements and blacklist
-// checks.
-class ExtensionInstallCheckerAsync : public ExtensionInstallCheckerForTest {
- public:
-  ExtensionInstallCheckerAsync(int enabled_checks, bool fail_fast)
-      : ExtensionInstallCheckerForTest(enabled_checks, fail_fast) {}
-
- protected:
-  void CheckRequirements() override {
-    requirements_check_called_ = true;
-
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::Bind(&ExtensionInstallCheckerForTest::MockCheckRequirements,
-                   base::Unretained(this)));
-  }
-
-  void CheckBlacklistState() override {
-    blacklist_check_called_ = true;
-
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::Bind(&ExtensionInstallCheckerForTest::MockCheckBlacklistState,
-                   base::Unretained(this)));
-  }
 };
 
 class CheckObserver {
@@ -144,24 +100,39 @@
   ExtensionInstallCheckerTest() {}
   ~ExtensionInstallCheckerTest() override {}
 
- protected:
-  void SetAllErrors(ExtensionInstallCheckerForTest* checker) {
-    checker->set_blacklist_state(kBlacklistStateError);
-    checker->set_policy_check_error(kDummyPolicyError);
-    checker->set_requirements_error(kDummyRequirementsError);
+  void SetBlacklistError(ExtensionInstallCheckerForTest* checker,
+                         PreloadCheck::Error error) {
+    auto blacklist_check = base::MakeUnique<PreloadCheckStub>();
+    blacklist_check->set_is_async(checker->is_async());
+    if (error != PreloadCheck::NONE)
+      blacklist_check->AddError(error);
+    checker->SetBlacklistCheckForTesting(std::move(blacklist_check));
   }
 
-  void ValidateExpectedCalls(int call_mask,
-                             const ExtensionInstallCheckerForTest& checker) {
-    bool expect_blacklist_checked =
-        (call_mask & ExtensionInstallChecker::CHECK_BLACKLIST) != 0;
-    bool expect_requirements_checked =
-        (call_mask & ExtensionInstallChecker::CHECK_REQUIREMENTS) != 0;
-    bool expect_policy_checked =
-        (call_mask & ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY) != 0;
-    EXPECT_EQ(expect_blacklist_checked, checker.blacklist_check_called());
-    EXPECT_EQ(expect_policy_checked, checker.policy_check_called());
-    EXPECT_EQ(expect_requirements_checked, checker.requirements_check_called());
+  void SetPolicyError(ExtensionInstallCheckerForTest* checker,
+                      PreloadCheck::Error error,
+                      std::string message) {
+    // The policy check always runs synchronously.
+    auto policy_check = base::MakeUnique<PreloadCheckStub>();
+    if (error != PreloadCheck::NONE) {
+      policy_check->AddError(error);
+      policy_check->set_error_message(base::UTF8ToUTF16(message));
+    }
+    checker->SetPolicyCheckForTesting(std::move(policy_check));
+  }
+
+ protected:
+  void SetAllPass(ExtensionInstallCheckerForTest* checker) {
+    SetBlacklistError(checker, PreloadCheck::NONE);
+    SetPolicyError(checker, PreloadCheck::NONE, "");
+    checker->set_requirements_error("");
+  }
+
+  void SetAllErrors(ExtensionInstallCheckerForTest* checker) {
+    SetBlacklistError(checker, kBlacklistError);
+    SetPolicyError(checker, PreloadCheck::DISALLOWED_BY_POLICY,
+                   kDummyPolicyError);
+    checker->set_requirements_error(kDummyRequirementsError);
   }
 
   void ExpectRequirementsPass(const ExtensionInstallCheckerForTest& checker) {
@@ -180,21 +151,19 @@
   }
 
   void ExpectBlacklistPass(const ExtensionInstallCheckerForTest& checker) {
-    EXPECT_EQ(NOT_BLACKLISTED, checker.blacklist_state());
+    EXPECT_EQ(PreloadCheck::NONE, checker.blacklist_error());
   }
 
   void ExpectBlacklistError(const ExtensionInstallCheckerForTest& checker) {
-    EXPECT_EQ(kBlacklistStateError, checker.blacklist_state());
+    EXPECT_EQ(kBlacklistError, checker.blacklist_error());
   }
 
   void ExpectPolicyPass(const ExtensionInstallCheckerForTest& checker) {
-    EXPECT_TRUE(checker.policy_allows_load());
     EXPECT_TRUE(checker.policy_error().empty());
   }
 
   void ExpectPolicyError(const char* expected_error,
                          const ExtensionInstallCheckerForTest& checker) {
-    EXPECT_FALSE(checker.policy_allows_load());
     EXPECT_FALSE(checker.policy_error().empty());
     EXPECT_EQ(std::string(expected_error), checker.policy_error());
   }
@@ -204,7 +173,6 @@
   }
 
   void RunChecker(ExtensionInstallCheckerForTest* checker,
-                  int expected_checks_run,
                   int expected_result) {
     CheckObserver observer;
     checker->Start(base::Bind(&CheckObserver::OnChecksComplete,
@@ -214,12 +182,11 @@
     EXPECT_FALSE(checker->is_running());
     EXPECT_EQ(expected_result, observer.result());
     EXPECT_EQ(1, observer.call_count());
-    ValidateExpectedCalls(expected_checks_run, *checker);
   }
 
   void DoRunAllChecksPass(ExtensionInstallCheckerForTest* checker) {
+    SetAllPass(checker);
     RunChecker(checker,
-               ExtensionInstallChecker::CHECK_ALL,
                0);
 
     ExpectRequirementsPass(*checker);
@@ -230,7 +197,6 @@
   void DoRunAllChecksFail(ExtensionInstallCheckerForTest* checker) {
     SetAllErrors(checker);
     RunChecker(checker,
-               ExtensionInstallChecker::CHECK_ALL,
                ExtensionInstallChecker::CHECK_ALL);
 
     ExpectRequirementsError(*checker);
@@ -241,15 +207,13 @@
   void DoRunSubsetOfChecks(int checks_to_run) {
     ExtensionInstallCheckerForTest sync_checker(checks_to_run,
                                                 /*fail_fast=*/false);
-    ExtensionInstallCheckerAsync async_checker(checks_to_run,
-                                               /*fail_fast=*/false);
-    ExtensionInstallCheckerForTest* checkers[] = {
-        &sync_checker, &async_checker,
-    };
+    ExtensionInstallCheckerForTest async_checker(checks_to_run,
+                                                 /*fail_fast=*/false);
+    async_checker.set_is_async(true);
 
-    for (auto* checker : checkers) {
+    for (auto* checker : {&sync_checker, &async_checker}) {
       SetAllErrors(checker);
-      RunChecker(checker, checks_to_run, checks_to_run);
+      RunChecker(checker, checks_to_run);
 
       if (checks_to_run & ExtensionInstallChecker::CHECK_REQUIREMENTS)
         ExpectRequirementsError(*checker);
@@ -279,8 +243,9 @@
       ExtensionInstallChecker::CHECK_ALL, /*fail_fast=*/false);
   DoRunAllChecksPass(&sync_checker);
 
-  ExtensionInstallCheckerAsync async_checker(ExtensionInstallChecker::CHECK_ALL,
-                                             /*fail_fast=*/false);
+  ExtensionInstallCheckerForTest async_checker(
+      ExtensionInstallChecker::CHECK_ALL, /*fail_fast=*/false);
+  async_checker.set_is_async(true);
   DoRunAllChecksPass(&async_checker);
 }
 
@@ -290,8 +255,9 @@
       ExtensionInstallChecker::CHECK_ALL, /*fail_fast=*/false);
   DoRunAllChecksFail(&sync_checker);
 
-  ExtensionInstallCheckerAsync async_checker(ExtensionInstallChecker::CHECK_ALL,
-                                             /*fail_fast=*/false);
+  ExtensionInstallCheckerForTest async_checker(
+      ExtensionInstallChecker::CHECK_ALL, /*fail_fast=*/false);
+  async_checker.set_is_async(true);
   DoRunAllChecksFail(&async_checker);
 }
 
@@ -312,8 +278,7 @@
     ExtensionInstallCheckerForTest checker(ExtensionInstallChecker::CHECK_ALL,
                                            /*fail_fast=*/true);
     SetAllErrors(&checker);
-    RunChecker(&checker, ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY,
-               ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY);
+    RunChecker(&checker, ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY);
 
     ExpectRequirementsPass(checker);
     ExpectPolicyError(checker);
@@ -326,8 +291,7 @@
             ExtensionInstallChecker::CHECK_BLACKLIST,
         /*fail_fast=*/true);
     SetAllErrors(&checker);
-    RunChecker(&checker, ExtensionInstallChecker::CHECK_REQUIREMENTS,
-               ExtensionInstallChecker::CHECK_REQUIREMENTS);
+    RunChecker(&checker, ExtensionInstallChecker::CHECK_REQUIREMENTS);
 
     ExpectRequirementsError(checker);
     ExpectPolicyPass(checker);
@@ -341,17 +305,16 @@
   // the requirements check runs before the blacklist check. Both checks should
   // be called, but the requirements check callback arrives first and the
   // blacklist result will be discarded.
-  ExtensionInstallCheckerAsync checker(ExtensionInstallChecker::CHECK_ALL,
-                                       /*fail_fast=*/true);
-
+  ExtensionInstallCheckerForTest checker(ExtensionInstallChecker::CHECK_ALL,
+                                         /*fail_fast=*/true);
+  checker.set_is_async(true);
   SetAllErrors(&checker);
 
   // The policy check is synchronous and needs to pass for the other tests to
   // run.
-  checker.set_policy_check_error(std::string());
+  SetPolicyError(&checker, PreloadCheck::NONE, "");
 
   RunChecker(&checker,
-             ExtensionInstallChecker::CHECK_ALL,
              ExtensionInstallChecker::CHECK_REQUIREMENTS);
 
   ExpectRequirementsError(checker);
diff --git a/chrome/browser/extensions/extension_unload_browsertest.cc b/chrome/browser/extensions/extension_unload_browsertest.cc
index ea2a94c..f11a576 100644
--- a/chrome/browser/extensions/extension_unload_browsertest.cc
+++ b/chrome/browser/extensions/extension_unload_browsertest.cc
@@ -6,6 +6,10 @@
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/test/browser_test_utils.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
 #include "ui/base/window_open_disposition.h"
 
 namespace extensions {
@@ -26,8 +30,7 @@
       WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(2, browser()->tab_strip_model()->count());
-  extension_service()->UnloadExtension(id,
-                                       UnloadedExtensionInfo::REASON_DISABLE);
+  DisableExtension(id);
   // There should only be one remaining web contents - the initial one.
   ASSERT_EQ(1, browser()->tab_strip_model()->count());
   EXPECT_EQ(
@@ -35,6 +38,53 @@
       browser()->tab_strip_model()->GetWebContentsAt(0)->GetLastCommittedURL());
 }
 
+// After an extension is uninstalled, network requests from its content scripts
+// should fail but not kill the renderer process.
+IN_PROC_BROWSER_TEST_F(ExtensionUnloadBrowserTest, UnloadWithContentScripts) {
+  host_resolver()->AddRule("maps.google.com", "127.0.0.1");
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  // Load an extension with a content script that has a button to send XHRs.
+  const Extension* extension =
+      LoadExtension(test_data_dir_.AppendASCII("xhr_from_content_script"));
+  ASSERT_TRUE(extension);
+  std::string id = extension->id();
+  ASSERT_EQ(1, browser()->tab_strip_model()->count());
+  GURL test_url = embedded_test_server()->GetURL("/title1.html");
+  ui_test_utils::NavigateToURL(browser(), test_url);
+
+  // Sending an XHR with the extension's Origin header should succeed when the
+  // extension is installed.
+  const char kSendXhrScript[] = "document.getElementById('xhrButton').click();";
+  bool xhr_result = false;
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      browser()->tab_strip_model()->GetActiveWebContents(), kSendXhrScript,
+      &xhr_result));
+  EXPECT_TRUE(xhr_result);
+
+  DisableExtension(id);
+
+  // The tab should still be open with the content script injected.
+  ASSERT_EQ(1, browser()->tab_strip_model()->count());
+  EXPECT_EQ(
+      test_url,
+      browser()->tab_strip_model()->GetWebContentsAt(0)->GetLastCommittedURL());
+
+  // Sending an XHR with the extension's Origin header should fail but not kill
+  // the tab.
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      browser()->tab_strip_model()->GetActiveWebContents(), kSendXhrScript,
+      &xhr_result));
+  EXPECT_FALSE(xhr_result);
+
+  // Ensure the process has not been killed.
+  EXPECT_TRUE(browser()
+                  ->tab_strip_model()
+                  ->GetActiveWebContents()
+                  ->GetMainFrame()
+                  ->IsRenderFrameLive());
+}
+
 // TODO(devlin): Investigate what to do for embedded iframes.
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/lazy_background_page_apitest.cc b/chrome/browser/extensions/lazy_background_page_apitest.cc
index 433df5d7..5b0696b9 100644
--- a/chrome/browser/extensions/lazy_background_page_apitest.cc
+++ b/chrome/browser/extensions/lazy_background_page_apitest.cc
@@ -510,39 +510,6 @@
   EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id()));
 }
 
-// Tests that a KeepaliveImpulse increments the keep alive count, but eventually
-// times out and background page will still close.
-IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, ImpulseAddsCount) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
-  const Extension* extension = LoadExtensionAndWait("messaging");
-  ASSERT_TRUE(extension);
-
-  // Lazy Background Page doesn't exist yet.
-  ProcessManager* pm = ProcessManager::Get(browser()->profile());
-  EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id()));
-  EXPECT_EQ(1, browser()->tab_strip_model()->count());
-
-  // Navigate to a page that opens a message channel to the background page.
-  ResultCatcher catcher;
-  LazyBackgroundObserver lazybg;
-  ui_test_utils::NavigateToURL(
-      browser(), embedded_test_server()->GetURL("/extensions/test_file.html"));
-  lazybg.WaitUntilLoaded();
-
-  // Add an impulse and the keep alive count increases.
-  int previous_keep_alive_count = pm->GetLazyKeepaliveCount(extension);
-  pm->KeepaliveImpulse(extension);
-  EXPECT_EQ(previous_keep_alive_count + 1,
-            pm->GetLazyKeepaliveCount(extension));
-
-  // Navigate away, closing the message channel and therefore the background
-  // page after the impulse times out.
-  ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
-  lazybg.WaitUntilClosed();
-
-  EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id()));
-}
-
 // Tests that the lazy background page receives the unload event when we
 // close it, and that it can execute simple API calls that don't require an
 // asynchronous response.
diff --git a/chrome/browser/first_run/first_run.cc b/chrome/browser/first_run/first_run.cc
index 8f66c1ad..dfe37fb54 100644
--- a/chrome/browser/first_run/first_run.cc
+++ b/chrome/browser/first_run/first_run.cc
@@ -54,7 +54,6 @@
 #include "chrome/grit/locale_settings.h"
 #include "chrome/installer/util/master_preferences.h"
 #include "chrome/installer/util/master_preferences_constants.h"
-#include "chrome/installer/util/util_constants.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_service.h"
 #include "components/search_engines/template_url_service.h"
diff --git a/chrome/browser/first_run/upgrade_util_win.cc b/chrome/browser/first_run/upgrade_util_win.cc
index 266f9b9..de4f067 100644
--- a/chrome/browser/first_run/upgrade_util_win.cc
+++ b/chrome/browser/first_run/upgrade_util_win.cc
@@ -34,7 +34,6 @@
 #include "chrome/installer/util/browser_distribution.h"
 #include "chrome/installer/util/google_update_constants.h"
 #include "chrome/installer/util/install_util.h"
-#include "chrome/installer/util/shell_util.h"
 #include "chrome/installer/util/util_constants.h"
 #include "components/prefs/pref_service.h"
 #include "ui/base/ui_base_switches.h"
diff --git a/chrome/browser/image_decoder.cc b/chrome/browser/image_decoder.cc
index 6823dbc..ee9dd6cf 100644
--- a/chrome/browser/image_decoder.cc
+++ b/chrome/browser/image_decoder.cc
@@ -13,7 +13,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/service_manager_connection.h"
 #include "ipc/ipc_channel.h"
-#include "services/image_decoder/public/cpp/decode.h"
+#include "services/data_decoder/public/cpp/decode_image.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/geometry/size.h"
@@ -24,7 +24,7 @@
     static_cast<int64_t>(IPC::Channel::kMaximumMessageSize);
 
 // Note that this is always called on the thread which initiated the
-// corresponding image_decoder::Decode request.
+// corresponding data_decoder::DecodeImage request.
 void OnDecodeImageDone(
     base::Callback<void(int)> fail_callback,
     base::Callback<void(const SkBitmap&, int)> success_callback,
@@ -49,7 +49,7 @@
 }
 
 void RunDecodeCallbackOnTaskRunner(
-    const image_decoder::mojom::ImageDecoder::DecodeImageCallback& callback,
+    const data_decoder::mojom::ImageDecoder::DecodeImageCallback& callback,
     scoped_refptr<base::SequencedTaskRunner> task_runner,
     const SkBitmap& image) {
   task_runner->PostTask(FROM_HERE, base::Bind(callback, image));
@@ -57,10 +57,10 @@
 
 void DecodeImage(
     std::vector<uint8_t> image_data,
-    image_decoder::mojom::ImageCodec codec,
+    data_decoder::mojom::ImageCodec codec,
     bool shrink_to_fit,
     const gfx::Size& desired_image_frame_size,
-    const image_decoder::mojom::ImageDecoder::DecodeImageCallback& callback,
+    const data_decoder::mojom::ImageDecoder::DecodeImageCallback& callback,
     scoped_refptr<base::SequencedTaskRunner> callback_task_runner) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
 
@@ -69,10 +69,10 @@
       service_manager::Connector::Create(&connector_request);
   BindToBrowserConnector(std::move(connector_request));
 
-  image_decoder::Decode(connector.get(), image_data, codec, shrink_to_fit,
-                        kMaxImageSizeInBytes, desired_image_frame_size,
-                        base::Bind(&RunDecodeCallbackOnTaskRunner, callback,
-                                   callback_task_runner));
+  data_decoder::DecodeImage(connector.get(), image_data, codec, shrink_to_fit,
+                            kMaxImageSizeInBytes, desired_image_frame_size,
+                            base::Bind(&RunDecodeCallbackOnTaskRunner, callback,
+                                       callback_task_runner));
 }
 
 }  // namespace
@@ -152,13 +152,13 @@
     image_request_id_map_.insert(std::make_pair(request_id, image_request));
   }
 
-  image_decoder::mojom::ImageCodec codec =
-      image_decoder::mojom::ImageCodec::DEFAULT;
+  data_decoder::mojom::ImageCodec codec =
+      data_decoder::mojom::ImageCodec::DEFAULT;
 #if defined(OS_CHROMEOS)
   if (image_codec == ROBUST_JPEG_CODEC)
-    codec = image_decoder::mojom::ImageCodec::ROBUST_JPEG;
+    codec = data_decoder::mojom::ImageCodec::ROBUST_JPEG;
   if (image_codec == ROBUST_PNG_CODEC)
-    codec = image_decoder::mojom::ImageCodec::ROBUST_PNG;
+    codec = data_decoder::mojom::ImageCodec::ROBUST_PNG;
 #endif  // defined(OS_CHROMEOS)
 
   auto callback = base::Bind(
diff --git a/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc b/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc
index ecc07c0..a9d0044 100644
--- a/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc
+++ b/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc
@@ -50,6 +50,8 @@
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_util.h"
 #include "components/google/core/browser/google_util.h"
 #include "components/policy/core/common/cloud/policy_header_io_helper.h"
+#include "components/previews/core/previews_experiments.h"
+#include "components/previews/core/previews_io_data.h"
 #include "components/rappor/public/rappor_utils.h"
 #include "components/rappor/rappor_service_impl.h"
 #include "components/search_engines/template_url_service.h"
@@ -890,6 +892,13 @@
       previews_state |= content::SERVER_LOFI_ON;
     if (data_reduction_proxy_io_data->ShouldEnableLitePages(url_request))
       previews_state |= content::SERVER_LITE_PAGE_ON;
+
+    previews::PreviewsIOData* previews_io_data = io_data->previews_io_data();
+    if (data_reduction_proxy_io_data->IsEnabled() && previews_io_data &&
+        previews_io_data->ShouldAllowPreview(
+            url_request, previews::PreviewsType::CLIENT_LOFI)) {
+      previews_state |= content::CLIENT_LOFI_ON;
+    }
   }
 
   if (previews_state == content::PREVIEWS_UNSPECIFIED)
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
index 4efa3788..1da42eb 100644
--- a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
@@ -30,7 +30,6 @@
 #include "base/win/registry.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/install_static/install_util.h"
-#include "chrome/installer/util/browser_distribution.h"
 #include "components/crash/content/app/crashpad.h"
 #endif  // OS_WIN
 
diff --git a/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc b/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc
index b971070..c07ab19 100644
--- a/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc
+++ b/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc
@@ -45,50 +45,6 @@
     "4EB74897CB187C7633357C2FE832E0AD6A44883A"   // see http://crbug.com/355141
 };
 
-// Handles an extension's NaCl process transitioning in or out of idle state by
-// relaying the state to the extension's process manager.
-//
-// A NaCl instance, when active (making PPAPI calls or receiving callbacks),
-// sends keepalive IPCs to the browser process BrowserPpapiHost at a throttled
-// rate. The content::BrowserPpapiHost passes context information up to the
-// chrome level NaClProcessHost where we use the instance's context to find the
-// associated extension process manager.
-//
-// There is a 1:many relationship for extension:nacl-embeds, but only a
-// 1:1 relationship for NaClProcessHost:PP_Instance. The content layer doesn't
-// rely on this knowledge because it routes messages for ppapi non-nacl
-// instances as well, though they won't have callbacks set. Here the 1:1
-// assumption is made and DCHECKed.
-void OnKeepaliveOnUIThread(
-    const content::BrowserPpapiHost::OnKeepaliveInstanceData& instance_data,
-    const base::FilePath& profile_data_directory) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  // Only one instance will exist for NaCl embeds, even when more than one
-  // embed of the same plugin exists on the same page.
-  DCHECK_EQ(1U, instance_data.size());
-  if (instance_data.size() < 1)
-    return;
-
-#if BUILDFLAG(ENABLE_EXTENSIONS)
-  extensions::ProcessManager::OnKeepaliveFromPlugin(
-      instance_data[0].render_process_id,
-      instance_data[0].render_frame_id,
-      instance_data[0].document_url.host());
-#endif
-}
-
-// Calls OnKeepaliveOnUIThread on UI thread.
-void OnKeepalive(
-    const content::BrowserPpapiHost::OnKeepaliveInstanceData& instance_data,
-    const base::FilePath& profile_data_directory) {
-  DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-  content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
-                                   base::Bind(&OnKeepaliveOnUIThread,
-                                              instance_data,
-                                              profile_data_directory));
-}
-
 }  // namespace
 
 NaClBrowserDelegateImpl::NaClBrowserDelegateImpl(
@@ -221,11 +177,6 @@
 #endif
 }
 
-content::BrowserPpapiHost::OnKeepaliveCallback
-NaClBrowserDelegateImpl::GetOnKeepaliveCallback() {
-  return base::Bind(&OnKeepalive);
-}
-
 bool NaClBrowserDelegateImpl::IsNonSfiModeAllowed(
     const base::FilePath& profile_directory,
     const GURL& manifest_url) {
diff --git a/chrome/browser/nacl_host/nacl_browser_delegate_impl.h b/chrome/browser/nacl_host/nacl_browser_delegate_impl.h
index a968d975..08ec6b4 100644
--- a/chrome/browser/nacl_host/nacl_browser_delegate_impl.h
+++ b/chrome/browser/nacl_host/nacl_browser_delegate_impl.h
@@ -45,8 +45,6 @@
                              base::FilePath* file_path) override;
   void SetDebugPatterns(const std::string& debug_patterns) override;
   bool URLMatchesDebugPatterns(const GURL& manifest_url) override;
-  content::BrowserPpapiHost::OnKeepaliveCallback GetOnKeepaliveCallback()
-      override;
   bool IsNonSfiModeAllowed(const base::FilePath& profile_directory,
                            const GURL& manifest_url) override;
 
diff --git a/chrome/browser/ntp_snippets/download_suggestions_provider_unittest.cc b/chrome/browser/ntp_snippets/download_suggestions_provider_unittest.cc
index e77a2c67..1788f8c 100644
--- a/chrome/browser/ntp_snippets/download_suggestions_provider_unittest.cc
+++ b/chrome/browser/ntp_snippets/download_suggestions_provider_unittest.cc
@@ -117,8 +117,7 @@
   if (extra.is_download_asset != is_download_asset) {
     return false;
   }
-  *result_listener << "expected target_file_path: "
-                   << target_file_path
+  *result_listener << "expected target_file_path: " << target_file_path
                    << "\nactual target_file_path: "
                    << extra.target_file_path.value();
   if (extra.target_file_path.value() !=
@@ -126,8 +125,7 @@
     return false;
   }
   *result_listener << "expected mime_type: " << mime_type
-                   << "\nactual mime_type: "
-                   << extra.mime_type;
+                   << "\nactual mime_type: " << extra.mime_type;
   return extra.mime_type == mime_type;
 }
 
diff --git a/chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.cc b/chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.cc
new file mode 100644
index 0000000..503641a
--- /dev/null
+++ b/chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.cc
@@ -0,0 +1,113 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.h"
+
+#include "base/memory/ptr_util.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/rand_util.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search/search.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/web_contents.h"
+
+namespace {
+
+base::TimeDelta GetNavigationDelayFromParams() {
+  double delay_probability = base::GetFieldTrialParamByFeatureAsDouble(
+      kDelayNavigationFeature,
+      DelayNavigationThrottle::kParamDelayNavigationProbability,
+      0 /* default value */);
+
+  DCHECK_GE(delay_probability, 0.0);
+  DCHECK_LE(delay_probability, 1.0);
+  if (delay_probability == 0 || delay_probability < base::RandDouble())
+    return base::TimeDelta();
+
+  int navigation_delay_millis = base::GetFieldTrialParamByFeatureAsInt(
+      kDelayNavigationFeature,
+      DelayNavigationThrottle::kParamDelayNavigationDurationMillis,
+      -1 /* default value */);
+
+  if (navigation_delay_millis <= 0)
+    return base::TimeDelta();
+
+  bool randomize_delay = base::GetFieldTrialParamByFeatureAsBool(
+      kDelayNavigationFeature,
+      DelayNavigationThrottle::kParamDelayNavigationRandomize,
+      false /* default value */);
+
+  if (randomize_delay) {
+    // RandGenerator produces a value in [0, navigation_delay_millis). We want
+    // a value in [1, navigation_delay_millis].
+    navigation_delay_millis = base::RandGenerator(navigation_delay_millis) + 1;
+  }
+
+  return base::TimeDelta::FromMilliseconds(navigation_delay_millis);
+}
+
+}  // namespace
+
+const base::Feature kDelayNavigationFeature{"DelayNavigation",
+                                            base::FEATURE_DISABLED_BY_DEFAULT};
+
+const char DelayNavigationThrottle::kParamDelayNavigationDurationMillis[] =
+    "delay_millis";
+
+const char DelayNavigationThrottle::kParamDelayNavigationRandomize[] =
+    "randomize_delay";
+
+const char DelayNavigationThrottle::kParamDelayNavigationProbability[] =
+    "delay_probability";
+
+// static
+std::unique_ptr<DelayNavigationThrottle>
+DelayNavigationThrottle::MaybeCreateThrottleFor(
+    content::NavigationHandle* handle) {
+  if (!handle->IsInMainFrame() ||
+      !base::FeatureList::IsEnabled(kDelayNavigationFeature) ||
+      !handle->GetURL().SchemeIsHTTPOrHTTPS()) {
+    return nullptr;
+  }
+
+  // Do not delay the NTP, which in some cases has an HTTPS URL.
+  if (search::IsNTPURL(handle->GetURL(),
+                       Profile::FromBrowserContext(
+                           handle->GetWebContents()->GetBrowserContext()))) {
+    return nullptr;
+  }
+
+  base::TimeDelta navigation_delay = GetNavigationDelayFromParams();
+  if (navigation_delay.is_zero())
+    return nullptr;
+
+  return base::MakeUnique<DelayNavigationThrottle>(
+      handle, base::ThreadTaskRunnerHandle::Get(), navigation_delay);
+}
+
+DelayNavigationThrottle::DelayNavigationThrottle(
+    content::NavigationHandle* handle,
+    scoped_refptr<base::TaskRunner> task_runner,
+    base::TimeDelta navigation_delay)
+    : content::NavigationThrottle(handle),
+      task_runner_(task_runner),
+      navigation_delay_(navigation_delay),
+      weak_ptr_factory_(this) {}
+
+DelayNavigationThrottle::~DelayNavigationThrottle() {}
+
+content::NavigationThrottle::ThrottleCheckResult
+DelayNavigationThrottle::WillStartRequest() {
+  task_runner_->PostDelayedTask(
+      FROM_HERE,
+      base::Bind(&DelayNavigationThrottle::OnDelayComplete,
+                 weak_ptr_factory_.GetWeakPtr()),
+      navigation_delay_);
+  return content::NavigationThrottle::DEFER;
+}
+
+void DelayNavigationThrottle::OnDelayComplete() {
+  navigation_handle()->Resume();
+}
diff --git a/chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.h b/chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.h
new file mode 100644
index 0000000..cea38df1
--- /dev/null
+++ b/chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.h
@@ -0,0 +1,69 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PAGE_LOAD_METRICS_EXPERIMENTS_DELAY_NAVIGATION_THROTTLE_H_
+#define CHROME_BROWSER_PAGE_LOAD_METRICS_EXPERIMENTS_DELAY_NAVIGATION_THROTTLE_H_
+
+#include <memory>
+
+#include "base/feature_list.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/task_runner.h"
+#include "base/time/time.h"
+#include "content/public/browser/navigation_throttle.h"
+
+// This feature controls whether the DelayNavigationThrottle should be
+// instantiated.
+extern const base::Feature kDelayNavigationFeature;
+
+// DelayNavigationThrottle introduces a delay to main frame navigations.
+class DelayNavigationThrottle : public content::NavigationThrottle {
+ public:
+  // The duration of the delay to add to the start of each navigation, in
+  // milliseconds.
+  static const char kParamDelayNavigationDurationMillis[];
+
+  // Whether the delay should be randomized in the interval 0ms and
+  // kParamDelayNavigationDurationMillis.
+  static const char kParamDelayNavigationRandomize[];
+
+  // The probability that the navigation delay should be introduced. Should be a
+  // double in the interval [0, 1], where a value of 0 indicates the delay
+  // should never be introduced, and a value of 1 indicates the delay should
+  // always be introduced.
+  static const char kParamDelayNavigationProbability[];
+
+  // Creates a DelayNavigationThrottle if the DelayNavigation feature is
+  // enabled and configured.
+  static std::unique_ptr<DelayNavigationThrottle> MaybeCreateThrottleFor(
+      content::NavigationHandle* handle);
+
+  // Creates a DelayNavigationThrottle directly. Only intended for use in
+  // tests. Production code should use MaybeCreateThrottleFor.
+  DelayNavigationThrottle(content::NavigationHandle* handle,
+                          scoped_refptr<base::TaskRunner> task_runner,
+                          base::TimeDelta navigation_delay);
+  ~DelayNavigationThrottle() override;
+
+  // Return the navigation delay for this throttle.
+  base::TimeDelta navigation_delay() const { return navigation_delay_; }
+
+  // content::NavigationThrottle:
+  content::NavigationThrottle::ThrottleCheckResult WillStartRequest() override;
+
+ private:
+  void OnDelayComplete();
+
+  const scoped_refptr<base::TaskRunner> task_runner_;
+  const base::TimeDelta navigation_delay_;
+
+  // This has to be the last member of the class.
+  base::WeakPtrFactory<DelayNavigationThrottle> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(DelayNavigationThrottle);
+};
+
+#endif  // CHROME_BROWSER_PAGE_LOAD_METRICS_EXPERIMENTS_DELAY_NAVIGATION_THROTTLE_H_
diff --git a/chrome/browser/page_load_metrics/experiments/delay_navigation_throttle_unittest.cc b/chrome/browser/page_load_metrics/experiments/delay_navigation_throttle_unittest.cc
new file mode 100644
index 0000000..64ce8a45
--- /dev/null
+++ b/chrome/browser/page_load_metrics/experiments/delay_navigation_throttle_unittest.cc
@@ -0,0 +1,213 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <tuple>
+#include <utility>
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/test_mock_time_task_runner.h"
+#include "base/time/time.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/variations/variations_associated_data.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/navigation_throttle.h"
+#include "net/http/http_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+class DelayNavigationThrottleTest : public ChromeRenderViewHostTestHarness {};
+
+TEST_F(DelayNavigationThrottleTest, BasicDelay) {
+  const char kBasicResponseHeaders[] = "HTTP/1.1 200 OK";
+  base::TimeDelta navigation_delay = base::TimeDelta::FromSeconds(1);
+  GURL url("http://www.example.com/");
+
+  scoped_refptr<base::TestMockTimeTaskRunner> mock_time_task_runner(
+      new base::TestMockTimeTaskRunner());
+  std::unique_ptr<content::NavigationHandle> test_handle =
+      content::NavigationHandle::CreateNavigationHandleForTesting(url,
+                                                                  main_rfh());
+  test_handle->RegisterThrottleForTesting(
+      base::MakeUnique<DelayNavigationThrottle>(
+          test_handle.get(), mock_time_task_runner, navigation_delay));
+
+  EXPECT_FALSE(mock_time_task_runner->HasPendingTask());
+  EXPECT_EQ(content::NavigationThrottle::DEFER,
+            test_handle->CallWillStartRequestForTesting(
+                false /* is_post */, content::Referrer(),
+                false /* has_user_gesture */, ui::PAGE_TRANSITION_LINK,
+                false /* is_external_protocol */));
+
+  // There may be other throttles that DEFER and post async tasks to the UI
+  // thread. Allow them to run to completion, so our throttle is guaranteed to
+  // have a chance to run.
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_TRUE(mock_time_task_runner->HasPendingTask());
+  EXPECT_FALSE(test_handle->HasCommitted());
+
+  mock_time_task_runner->FastForwardBy(navigation_delay);
+  EXPECT_FALSE(mock_time_task_runner->HasPendingTask());
+
+  // Run any remaining async tasks, to make sure all other deferred throttles
+  // can complete.
+  base::RunLoop().RunUntilIdle();
+
+  // Verify that the WillSendRequest portion of the navigation has completed,
+  // and NavigationHandle::WillProcessResponse and the commit portion of the
+  // navigation lifetime can now be invoked.
+  EXPECT_EQ(content::NavigationThrottle::PROCEED,
+            test_handle->CallWillProcessResponseForTesting(
+                main_rfh(),
+                net::HttpUtil::AssembleRawHeaders(
+                    kBasicResponseHeaders, strlen(kBasicResponseHeaders))));
+  test_handle->CallDidCommitNavigationForTesting(url);
+  EXPECT_TRUE(test_handle->HasCommitted());
+}
+
+enum ExpectInstantiationResult {
+  EXPECT_INSTANTIATION,
+  EXPECT_NO_INSTANTIATION
+};
+
+class DelayNavigationThrottleInstantiationTest
+    : public ChromeRenderViewHostTestHarness,
+      public testing::WithParamInterface<
+          std::tuple<ExpectInstantiationResult,
+                     base::FeatureList::OverrideState,
+                     base::TimeDelta,
+                     bool,
+                     double,
+                     GURL>> {
+ public:
+  DelayNavigationThrottleInstantiationTest()
+      : field_trial_list_(nullptr /* entropy_provider */) {}
+
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+
+    std::tie(expected_instantiation_result_, feature_state_, param_delay_,
+             param_randomize_delay_, param_probability_, url_) = GetParam();
+
+    std::map<std::string, std::string> variation_params(
+        {{DelayNavigationThrottle::kParamDelayNavigationDurationMillis,
+          base::IntToString(param_delay_.InMilliseconds())},
+         {DelayNavigationThrottle::kParamDelayNavigationRandomize,
+          param_randomize_delay_ ? "true" : "false"},
+         {DelayNavigationThrottle::kParamDelayNavigationProbability,
+          base::DoubleToString(param_probability_)}});
+    InitializeScopedFeatureList(feature_state_, variation_params);
+  }
+
+  void TearDown() override {
+    ChromeRenderViewHostTestHarness::TearDown();
+    variations::testing::ClearAllVariationParams();
+  }
+
+  void InitializeScopedFeatureList(
+      base::FeatureList::OverrideState feature_state,
+      const std::map<std::string, std::string>& variation_params) {
+    static const char kTestFieldTrialName[] = "TestTrial";
+    static const char kTestExperimentGroupName[] = "TestGroup";
+
+    EXPECT_TRUE(variations::AssociateVariationParams(
+        kTestFieldTrialName, kTestExperimentGroupName, variation_params));
+
+    base::FieldTrial* field_trial = base::FieldTrialList::CreateFieldTrial(
+        kTestFieldTrialName, kTestExperimentGroupName);
+
+    std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
+    feature_list->RegisterFieldTrialOverride(kDelayNavigationFeature.name,
+                                             feature_state, field_trial);
+
+    // Since we are adding a scoped feature list after browser start, copy over
+    // the existing feature list to prevent inconsistency.
+    base::FeatureList* existing_feature_list = base::FeatureList::GetInstance();
+    if (existing_feature_list) {
+      std::string enabled_features;
+      std::string disabled_features;
+      base::FeatureList::GetInstance()->GetFeatureOverrides(&enabled_features,
+                                                            &disabled_features);
+      feature_list->InitializeFromCommandLine(enabled_features,
+                                              disabled_features);
+    }
+
+    scoped_feature_list_.InitWithFeatureList(std::move(feature_list));
+  }
+
+  base::FieldTrialList field_trial_list_;
+  base::test::ScopedFeatureList scoped_feature_list_;
+
+  // Fields filled in via GetParam():
+  base::FeatureList::OverrideState feature_state_;
+  base::TimeDelta param_delay_;
+  bool param_randomize_delay_ = false;
+  double param_probability_ = 0;
+  GURL url_;
+  ExpectInstantiationResult expected_instantiation_result_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DelayNavigationThrottleInstantiationTest);
+};
+
+TEST_P(DelayNavigationThrottleInstantiationTest, Instantiate) {
+  std::unique_ptr<content::NavigationHandle> test_handle =
+      content::NavigationHandle::CreateNavigationHandleForTesting(url_,
+                                                                  main_rfh());
+  std::unique_ptr<DelayNavigationThrottle> throttle =
+      DelayNavigationThrottle::MaybeCreateThrottleFor(test_handle.get());
+  const bool expect_instantiation =
+      expected_instantiation_result_ == EXPECT_INSTANTIATION;
+  EXPECT_EQ(expect_instantiation, throttle != nullptr);
+  if (throttle) {
+    base::TimeDelta delay = throttle->navigation_delay();
+    EXPECT_FALSE(delay.is_zero());
+    EXPECT_GE(param_delay_, delay);
+  }
+}
+
+INSTANTIATE_TEST_CASE_P(
+    InstantiateThrottle,
+    DelayNavigationThrottleInstantiationTest,
+    ::testing::Values(
+        std::make_tuple(EXPECT_NO_INSTANTIATION,
+                        base::FeatureList::OVERRIDE_DISABLE_FEATURE,
+                        base::TimeDelta::FromMilliseconds(10),
+                        false /* randomize delay */,
+                        1.0 /* delay probability */,
+                        GURL("http://www.example.com/")),
+        std::make_tuple(EXPECT_NO_INSTANTIATION,
+                        base::FeatureList::OVERRIDE_ENABLE_FEATURE,
+                        base::TimeDelta::FromMilliseconds(10),
+                        false /* randomize delay */,
+                        1.0 /* delay probability */,
+                        GURL("chrome://version")),
+        std::make_tuple(EXPECT_NO_INSTANTIATION,
+                        base::FeatureList::OVERRIDE_ENABLE_FEATURE,
+                        base::TimeDelta::FromMilliseconds(10),
+                        false /* randomize delay */,
+                        0.0 /* delay probability */,
+                        GURL("http://www.example.com/")),
+        std::make_tuple(EXPECT_INSTANTIATION,
+                        base::FeatureList::OVERRIDE_ENABLE_FEATURE,
+                        base::TimeDelta::FromMilliseconds(10),
+                        false /* randomize delay */,
+                        1.0 /* delay probability */,
+                        GURL("http://www.example.com/")),
+        std::make_tuple(EXPECT_INSTANTIATION,
+                        base::FeatureList::OVERRIDE_ENABLE_FEATURE,
+                        base::TimeDelta::FromMilliseconds(10),
+                        true /* randomize delay */,
+                        1.0 /* delay probability */,
+                        GURL("http://www.example.com/"))));
diff --git a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
index a07e5ee..3a2a2e5 100644
--- a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
@@ -161,6 +161,8 @@
     "PageLoad.PageTiming.ForegroundDuration";
 const char kHistogramPageTimingForegroundDurationAfterPaint[] =
     "PageLoad.PageTiming.ForegroundDuration.AfterPaint";
+const char kHistogramPageTimingForegroundDurationNoCommit[] =
+    "PageLoad.PageTiming.ForegroundDuration.NoCommit";
 
 const char kHistogramLoadTypeParseStartReload[] =
     "PageLoad.ParseTiming.NavigationToParseStart.LoadType.Reload";
@@ -570,9 +572,10 @@
 void CorePageLoadMetricsObserver::OnComplete(
     const page_load_metrics::PageLoadTiming& timing,
     const page_load_metrics::PageLoadExtraInfo& info) {
-  RecordTimingHistograms(timing, info, base::TimeTicks());
+  RecordTimingHistograms(timing, info);
   RecordByteAndResourceHistograms(timing, info);
   RecordRappor(timing, info);
+  RecordForegroundDurationHistograms(timing, info, base::TimeTicks());
 }
 
 page_load_metrics::PageLoadMetricsObserver::ObservePolicy
@@ -584,9 +587,10 @@
   // flow. After this method is invoked, Chrome may be killed without further
   // notification, so we record final metrics collected up to this point.
   if (info.did_commit) {
-    RecordTimingHistograms(timing, info, base::TimeTicks::Now());
+    RecordTimingHistograms(timing, info);
     RecordByteAndResourceHistograms(timing, info);
   }
+  RecordForegroundDurationHistograms(timing, info, base::TimeTicks::Now());
   return STOP_OBSERVING;
 }
 
@@ -604,6 +608,10 @@
                           failed_load_info.time_to_failed_provisional_load);
     }
   }
+  // Provide an empty PageLoadTiming, since we don't have any timing metrics
+  // for failed provisional loads.
+  RecordForegroundDurationHistograms(page_load_metrics::PageLoadTiming(),
+                                     extra_info, base::TimeTicks());
 }
 
 void CorePageLoadMetricsObserver::OnUserInput(
@@ -654,8 +662,7 @@
 
 void CorePageLoadMetricsObserver::RecordTimingHistograms(
     const page_load_metrics::PageLoadTiming& timing,
-    const page_load_metrics::PageLoadExtraInfo& info,
-    base::TimeTicks app_background_time) {
+    const page_load_metrics::PageLoadExtraInfo& info) {
   // Log time to first foreground / time to first background. Log counts that we
   // started a relevant page load in the foreground / background.
   if (!info.started_in_foreground && info.first_foreground_time) {
@@ -693,10 +700,18 @@
                           timing.first_meaningful_paint.value());
     }
   }
+}
 
+void CorePageLoadMetricsObserver::RecordForegroundDurationHistograms(
+    const page_load_metrics::PageLoadTiming& timing,
+    const page_load_metrics::PageLoadExtraInfo& info,
+    base::TimeTicks app_background_time) {
   base::Optional<base::TimeDelta> foreground_duration =
       GetInitialForegroundDuration(info, app_background_time);
-  if (foreground_duration) {
+  if (!foreground_duration)
+    return;
+
+  if (info.did_commit) {
     PAGE_LOAD_LONG_HISTOGRAM(internal::kHistogramPageTimingForegroundDuration,
                              foreground_duration.value());
     if (timing.first_paint && timing.first_paint < foreground_duration) {
@@ -704,6 +719,10 @@
           internal::kHistogramPageTimingForegroundDurationAfterPaint,
           foreground_duration.value() - timing.first_paint.value());
     }
+  } else {
+    PAGE_LOAD_LONG_HISTOGRAM(
+        internal::kHistogramPageTimingForegroundDurationNoCommit,
+        foreground_duration.value());
   }
 }
 
diff --git a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h
index f5f03ddb2..5147e51 100644
--- a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h
+++ b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h
@@ -42,6 +42,7 @@
 extern const char kHistogramFailedProvisionalLoad[];
 
 extern const char kHistogramPageTimingForegroundDuration[];
+extern const char kHistogramPageTimingForegroundDurationNoCommit[];
 
 extern const char kRapporMetricsNameCoarseTiming[];
 extern const char kHistogramFirstMeaningfulPaintStatus[];
@@ -135,13 +136,16 @@
 
  private:
   void RecordTimingHistograms(const page_load_metrics::PageLoadTiming& timing,
-                              const page_load_metrics::PageLoadExtraInfo& info,
-                              base::TimeTicks app_background_time);
+                              const page_load_metrics::PageLoadExtraInfo& info);
   void RecordByteAndResourceHistograms(
       const page_load_metrics::PageLoadTiming& timing,
       const page_load_metrics::PageLoadExtraInfo& info);
   void RecordRappor(const page_load_metrics::PageLoadTiming& timing,
                     const page_load_metrics::PageLoadExtraInfo& info);
+  void RecordForegroundDurationHistograms(
+      const page_load_metrics::PageLoadTiming& timing,
+      const page_load_metrics::PageLoadExtraInfo& info,
+      base::TimeTicks app_background_time);
 
   ui::PageTransition transition_;
   bool was_no_store_main_resource_;
diff --git a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc
index 2d106d4..f109f3b 100644
--- a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc
@@ -322,6 +322,11 @@
   histogram_tester().ExpectTotalCount(internal::kHistogramFirstTextPaint, 0);
   histogram_tester().ExpectTotalCount(internal::kHistogramFailedProvisionalLoad,
                                       1);
+
+  histogram_tester().ExpectTotalCount(
+      internal::kHistogramPageTimingForegroundDuration, 0);
+  histogram_tester().ExpectTotalCount(
+      internal::kHistogramPageTimingForegroundDurationNoCommit, 1);
 }
 
 TEST_F(CorePageLoadMetricsObserverTest, FailedBackgroundProvisionalLoad) {
diff --git a/chrome/browser/password_manager/OWNERS b/chrome/browser/password_manager/OWNERS
index 6855fad..dc638c4 100644
--- a/chrome/browser/password_manager/OWNERS
+++ b/chrome/browser/password_manager/OWNERS
@@ -1,6 +1,5 @@
 dvadym@chromium.org
 engedy@chromium.org
-gcasto@chromium.org
 melandory@chromium.org
 mkwst@chromium.org
 vabr@chromium.org
diff --git a/chrome/browser/payments/chrome_payment_request_delegate.cc b/chrome/browser/payments/chrome_payment_request_delegate.cc
index 7b228b62..7254446 100644
--- a/chrome/browser/payments/chrome_payment_request_delegate.cc
+++ b/chrome/browser/payments/chrome_payment_request_delegate.cc
@@ -41,4 +41,10 @@
   return g_browser_process->GetApplicationLocale();
 }
 
+bool ChromePaymentRequestDelegate::IsIncognito() const {
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents_->GetBrowserContext());
+  return profile && profile->GetProfileType() == Profile::INCOGNITO_PROFILE;
+}
+
 }  // namespace payments
diff --git a/chrome/browser/payments/chrome_payment_request_delegate.h b/chrome/browser/payments/chrome_payment_request_delegate.h
index d132ba5..ae8f03a 100644
--- a/chrome/browser/payments/chrome_payment_request_delegate.h
+++ b/chrome/browser/payments/chrome_payment_request_delegate.h
@@ -26,6 +26,7 @@
   void CloseDialog() override;
   autofill::PersonalDataManager* GetPersonalDataManager() override;
   const std::string& GetApplicationLocale() const override;
+  bool IsIncognito() const override;
 
  protected:
   // Reference to the dialog so that we can satisfy calls to CloseDialog(). This
diff --git a/chrome/browser/previews/previews_service.cc b/chrome/browser/previews/previews_service.cc
index a0375e5..8ddcfd18 100644
--- a/chrome/browser/previews/previews_service.cc
+++ b/chrome/browser/previews/previews_service.cc
@@ -24,6 +24,8 @@
   switch (type) {
     case previews::PreviewsType::OFFLINE:
       return previews::params::IsOfflinePreviewsEnabled();
+    case previews::PreviewsType::CLIENT_LOFI:
+      return previews::params::IsClientLoFiEnabled();
     case previews::PreviewsType::NONE:
     case previews::PreviewsType::LAST:
       break;
@@ -38,6 +40,8 @@
   switch (type) {
     case previews::PreviewsType::OFFLINE:
       return previews::params::OfflinePreviewsVersion();
+    case previews::PreviewsType::CLIENT_LOFI:
+      return previews::params::ClientLoFiVersion();
     case previews::PreviewsType::NONE:
     case previews::PreviewsType::LAST:
       break;
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc
index e468b2cc..67a9a9d 100644
--- a/chrome/browser/profiles/profile_impl_io_data.cc
+++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -194,11 +194,11 @@
   if (io_data_->lazy_params_->domain_reliability_monitor)
     io_data_->lazy_params_->domain_reliability_monitor->MoveToNetworkThread();
 
-  io_data_->previews_io_data_ = base::MakeUnique<previews::PreviewsIOData>(
+  io_data_->set_previews_io_data(base::MakeUnique<previews::PreviewsIOData>(
       BrowserThread::GetTaskRunnerForThread(BrowserThread::UI),
-      BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
+      BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)));
   PreviewsServiceFactory::GetForProfile(profile_)->Initialize(
-      io_data_->previews_io_data_.get(),
+      io_data_->previews_io_data(),
       BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), profile_path);
 
   io_data_->set_data_reduction_proxy_io_data(
@@ -546,7 +546,7 @@
 #if defined(OS_ANDROID)
   request_interceptors.push_back(
       base::MakeUnique<offline_pages::OfflinePageRequestInterceptor>(
-          previews_io_data_.get()));
+          previews_io_data()));
 #endif
 
   // The data reduction proxy interceptor should be as close to the network
diff --git a/chrome/browser/profiles/profile_impl_io_data.h b/chrome/browser/profiles/profile_impl_io_data.h
index 0a46ea7..da8eb184 100644
--- a/chrome/browser/profiles/profile_impl_io_data.h
+++ b/chrome/browser/profiles/profile_impl_io_data.h
@@ -31,10 +31,6 @@
 class SdchOwner;
 }  // namespace net
 
-namespace previews {
-class PreviewsIOData;
-}
-
 namespace storage {
 class SpecialStoragePolicy;
 }  // namespace storage
@@ -227,8 +223,6 @@
 
   mutable std::unique_ptr<net::SdchOwner> sdch_policy_;
 
-  mutable std::unique_ptr<previews::PreviewsIOData> previews_io_data_;
-
   // Parameters needed for isolated apps.
   base::FilePath profile_path_;
   int app_cache_max_size_;
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index 60cf509..fae638d1 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -74,6 +74,7 @@
 #include "components/policy/core/common/cloud/policy_header_service.h"
 #include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
 #include "components/prefs/pref_service.h"
+#include "components/previews/core/previews_io_data.h"
 #include "components/signin/core/common/signin_pref_names.h"
 #include "components/url_formatter/url_fixer.h"
 #include "content/public/browser/browser_thread.h"
@@ -945,6 +946,11 @@
   data_reduction_proxy_io_data_ = std::move(data_reduction_proxy_io_data);
 }
 
+void ProfileIOData::set_previews_io_data(
+    std::unique_ptr<previews::PreviewsIOData> previews_io_data) const {
+  previews_io_data_ = std::move(previews_io_data);
+}
+
 ProfileIOData::ResourceContext::ResourceContext(ProfileIOData* io_data)
     : io_data_(io_data),
       host_resolver_(NULL),
diff --git a/chrome/browser/profiles/profile_io_data.h b/chrome/browser/profiles/profile_io_data.h
index dd4b25d..95c0ff8e 100644
--- a/chrome/browser/profiles/profile_io_data.h
+++ b/chrome/browser/profiles/profile_io_data.h
@@ -97,6 +97,10 @@
 class URLBlacklistManager;
 }  // namespace policy
 
+namespace previews {
+class PreviewsIOData;
+}
+
 // Conceptually speaking, the ProfileIOData represents data that lives on the IO
 // thread that is owned by a Profile, such as, but not limited to, network
 // objects like CookieMonster, HttpTransactionFactory, etc.  Profile owns
@@ -241,6 +245,10 @@
     return data_reduction_proxy_io_data_.get();
   }
 
+  previews::PreviewsIOData* previews_io_data() const {
+    return previews_io_data_.get();
+  }
+
   // This function is to be used to check if the |url| is defined in
   // blacklist or whitelist policy.
   virtual policy::URLBlacklist::URLBlacklistState GetURLBlacklistState(
@@ -383,6 +391,9 @@
       std::unique_ptr<data_reduction_proxy::DataReductionProxyIOData>
           data_reduction_proxy_io_data) const;
 
+  void set_previews_io_data(
+      std::unique_ptr<previews::PreviewsIOData> previews_io_data) const;
+
   net::ProxyService* proxy_service() const {
     return proxy_service_.get();
   }
@@ -554,6 +565,8 @@
   mutable scoped_refptr<extensions::InfoMap> extension_info_map_;
 #endif
 
+  mutable std::unique_ptr<previews::PreviewsIOData> previews_io_data_;
+
   mutable std::unique_ptr<data_reduction_proxy::DataReductionProxyIOData>
       data_reduction_proxy_io_data_;
 
diff --git a/chrome/browser/resources/chromeos/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/chromevox/BUILD.gn
index 783fcfd..e63051b 100644
--- a/chrome/browser/resources/chromeos/chromevox/BUILD.gn
+++ b/chrome/browser/resources/chromeos/chromevox/BUILD.gn
@@ -145,7 +145,6 @@
   "cvox2/background/panel_command.js",
   "cvox2/background/panel_menu.js",
   "cvox2/background/panel_menu_item.js",
-  "cvox2/background/stubs.js",
   "cvox2/background/tabs_automation_handler.js",
   "cvox2/background/tree_walker.js",
   "cvox2/background/tutorial.js",
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/externs.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/externs.js
index 8f220ce..4c1c4b42 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/externs.js
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/externs.js
@@ -6,68 +6,3 @@
 
 var localStorage = {};
 var sessionStorage = {};
-
-/**
- * @type {Object}
- */
-chrome.accessibilityPrivate = {};
-
-/**
- * @param {boolean} on
- */
-chrome.accessibilityPrivate.setAccessibilityEnabled = function(on) {};
-
-/**
- * @param {boolean} on
- */
-chrome.accessibilityPrivate.setNativeAccessibilityEnabled = function(on) {
-};
-
-/**
- * @param {boolean} enabled
- * @param {boolean} capture
- */
-chrome.accessibilityPrivate.setKeyboardListener = function(enabled, capture) {
-};
-
-/**
- * @param {number} tabId
- * @param {function(Array<!Object>)} callback
- */
-chrome.accessibilityPrivate.getAlertsForTab =
-    function(tabId, callback) {};
-
-/**
- * @param {Array<{left: number, top: number, width: number, height: number}>}
- *     rects The bounding rects to draw focus ring(s) around, in global
- *     screen coordinates.
- */
-chrome.accessibilityPrivate.setFocusRing = function(rects) {
-};
-
-/** @type ChromeEvent */
-chrome.accessibilityPrivate.onWindowOpened;
-
-/** @type ChromeEvent */
-chrome.accessibilityPrivate.onWindowClosed;
-
-/** @type ChromeEvent */
-chrome.accessibilityPrivate.onMenuOpened;
-
-/** @type ChromeEvent */
-chrome.accessibilityPrivate.onMenuClosed;
-
-/** @type ChromeEvent */
-chrome.accessibilityPrivate.onControlFocused;
-
-/** @type ChromeEvent */
-chrome.accessibilityPrivate.onControlAction;
-
-/** @type ChromeEvent */
-chrome.accessibilityPrivate.onControlHover;
-
-/** @type ChromeEvent */
-chrome.accessibilityPrivate.onTextChanged;
-
-/** @type {ChromeEvent|!Object} */
-chrome.accessibilityPrivate.onAccessibilityGesture;
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json b/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json
index de5c4bf..dcea718 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json
@@ -895,6 +895,25 @@
           "ctrlKey": [true]
         }
       }
+    },
+    {
+      "command": "darkenScreen",
+      "sequence": {
+        "cvoxModifier": true,
+        "keys": {
+          "keyCode": [118],
+          "shiftKey": [true]
+        }
+      }
+    },
+        {
+      "command": "undarkenScreen",
+      "sequence": {
+        "cvoxModifier": true,
+        "keys": {
+          "keyCode": [118]
+        }
+      }
     }
   ]
 }
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/tabs_api_handler.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/tabs_api_handler.js
index c2846f8..e957f4c 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/tabs_api_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/tabs_api_handler.js
@@ -9,7 +9,6 @@
 
 goog.provide('cvox.TabsApiHandler');
 
-goog.require('Stubs');
 goog.require('TabsAutomationHandler');
 goog.require('cvox.AbstractEarcons');
 goog.require('cvox.AbstractTts');
diff --git a/chrome/browser/resources/chromeos/chromevox/common/command_store.js b/chrome/browser/resources/chromeos/chromevox/common/command_store.js
index 71e69f8..200fdf1 100644
--- a/chrome/browser/resources/chromeos/chromevox/common/command_store.js
+++ b/chrome/browser/resources/chromeos/chromevox/common/command_store.js
@@ -339,6 +339,16 @@
                          msgId: 'toggle_search_widget',
                          category: 'information'},
 
+  'undarkenScreen': {
+    msgId: 'undarken_screen',
+    category: 'help_commands'
+  },
+
+  'darkenScreen': {
+    msgId: 'darken_screen',
+    category: 'help_commands'
+},
+
   'toggleKeyboardHelp': {announce: false,
                          disallowContinuation: true,
                          msgId: 'show_power_key',
diff --git a/chrome/browser/resources/chromeos/chromevox/common/key_sequence.js b/chrome/browser/resources/chromeos/chromevox/common/key_sequence.js
index 3b05c604..e4f1a82 100644
--- a/chrome/browser/resources/chromeos/chromevox/common/key_sequence.js
+++ b/chrome/browser/resources/chromeos/chromevox/common/key_sequence.js
@@ -69,8 +69,6 @@
     throw 'Prefix key and sticky mode cannot both be enabled: ' + originalEvent;
   }
 
-  var event = this.resolveChromeOSSpecialKeys_(originalEvent);
-
   // TODO (rshearer): We should take the user out of sticky mode if they
   // try to use the CVox modifier or prefix key.
 
@@ -98,7 +96,7 @@
     keyCode: []
   };
 
-  this.extractKey_(event);
+  this.extractKey_(originalEvent);
 };
 
 
@@ -570,80 +568,3 @@
     seqEvent['keyCode'] = 45;
   }
 };
-
-
-/**
- * Used to resolve special ChromeOS keys (see link for more detail).
- * http://crbug.com/162268
- * @param {Object} originalEvent The event.
- * @return {Object} The resolved event.
- * @private
- */
-cvox.KeySequence.prototype.resolveChromeOSSpecialKeys_ =
-    function(originalEvent) {
-  if (!this.cvoxModifier || this.stickyMode || this.prefixKey ||
-      !cvox.ChromeVox.isChromeOS) {
-    return originalEvent;
-  }
-  var evt = {};
-  for (var key in originalEvent) {
-    evt[key] = originalEvent[key];
-  }
-  switch (evt['keyCode']) {
-    case 33:  // Page up.
-      evt['keyCode'] = 38;  // Up arrow.
-      break;
-    case 34:  // Page down.
-      evt['keyCode'] = 40;  // Down arrow.
-      break;
-    case 35:  // End.
-      evt['keyCode'] = 39;  // Right arrow.
-      break;
-    case 36:  // Home.
-      evt['keyCode'] = 37;  // Left arrow.
-      break;
-    case 45:  // Insert.
-      evt['keyCode'] = 190;  // Period.
-      break;
-    case 46:  // Delete.
-      evt['keyCode'] = 8;  // Backspace.
-      break;
-    case 112:  // F1.
-      evt['keyCode'] = 49;  // 1.
-      break;
-    case 113:  // F2.
-      evt['keyCode'] = 50;  // 2.
-      break;
-    case 114:  // F3.
-      evt['keyCode'] = 51;  // 3.
-      break;
-    case 115:  // F4.
-      evt['keyCode'] = 52;  // 4.
-      break;
-    case 116:  // F5.
-      evt['keyCode'] = 53;  // 5.
-      break;
-    case 117:  // F6.
-      evt['keyCode'] = 54;  // 6.
-      break;
-    case 118:  // F7.
-      evt['keyCode'] = 55;  // 7.
-      break;
-    case 119:  // F8.
-      evt['keyCode'] = 56;  // 8.
-      break;
-    case 120:  // F9.
-      evt['keyCode'] = 57;  // 9.
-      break;
-    case 121:  // F10.
-      evt['keyCode'] = 48;  // 0.
-      break;
-    case 122:  // F11
-      evt['keyCode'] = 189;  // Hyphen.
-      break;
-    case 123:  // F12
-      evt['keyCode'] = 187;  // Equals.
-      break;
-  }
-  return evt;
-};
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
index 8e882935..b275a41 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
@@ -23,7 +23,6 @@
 goog.require('Output');
 goog.require('Output.EventType');
 goog.require('PanelCommand');
-goog.require('Stubs');
 goog.require('constants');
 goog.require('cursors.Cursor');
 goog.require('cvox.BrailleKeyCommand');
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/braille_command_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/braille_command_handler.js
index b5345cab..3386354 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/braille_command_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/braille_command_handler.js
@@ -134,6 +134,10 @@
 
   // Question.
   map([1, 4, 5, 6], 'toggleKeyboardHelp');
+
+  // All cells (with 7 as mod).
+  map([1, 2, 3, 4, 5, 6, 7], 'darkenScreen');
+  map([1, 2, 3, 4, 5, 6], 'undarkenScreen');
 };
 
 BrailleCommandHandler.init_();
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js
index f37c373..de88815 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js
@@ -192,6 +192,14 @@
     case 'showNextUpdatePage':
       (new PanelCommand(PanelCommandType.UPDATE_NOTES)).send();
       return false;
+    case 'darkenScreen':
+      chrome.accessibilityPrivate.darkenScreen(true);
+      new Output().format('@darken_screen').go();
+      break;
+    case 'undarkenScreen':
+      chrome.accessibilityPrivate.darkenScreen(false);
+      new Output().format('@undarken_screen').go();
+      break;
     default:
       break;
   }
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
index a981fc5..d698bb09 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
@@ -12,7 +12,6 @@
 goog.require('BaseAutomationHandler');
 goog.require('ChromeVoxState');
 goog.require('CustomAutomationEvent');
-goog.require('Stubs');
 goog.require('editing.TextEditHandler');
 
 goog.scope(function() {
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
index 4572068..e56e7bf 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -12,7 +12,6 @@
 goog.require('AutomationTreeWalker');
 goog.require('EarconEngine');
 goog.require('Spannable');
-goog.require('Stubs');
 goog.require('constants');
 goog.require('cursors.Cursor');
 goog.require('cursors.Range');
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/stubs.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/stubs.js
deleted file mode 100644
index 3afc66d5..0000000
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/stubs.js
+++ /dev/null
@@ -1,37 +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.
-
-/**
- * @fileoverview Installs stubs for unsupported api's on some platforms. Define
- * the stubs here and require Stubs in the calling file.
- */
-
-goog.provide('Stubs');
-
-goog.require('cvox.ChromeVox');
-
-/** Initializes this module. */
-Stubs.init = function() {
-  // These api's throw for non-Chrome OS.
-  if (!cvox.ChromeVox.isChromeOS) {
-    chrome.accessibilityPrivate.onAccessibilityGesture = {};
-    chrome.accessibilityPrivate.onAccessibilityGesture.addListener =
-        function() {};
-    chrome.accessibilityPrivate.setFocusRing = function() {};
-    chrome.accessibilityPrivate.setKeyboardListener = function() {};
-  }
-
-  // This api throws on Mac.
-  if (cvox.ChromeVox.isMac) {
-    chrome.automation.getDesktop = function() {};
-  }
-
-  // Missing api's until 53.
-  if (!chrome.automation.NameFromType) {
-    chrome.automation['NameFromType'] = {};
-    chrome.automation['DescriptionFromType'] = {};
-  }
-};
-
-Stubs.init();
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/injected/loader.js b/chrome/browser/resources/chromeos/chromevox/cvox2/injected/loader.js
index 1963d10..911a905 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/injected/loader.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/injected/loader.js
@@ -10,7 +10,7 @@
  */
 function initMin() {
   if (cvox.ChromeVox.isChromeOS) {
-    cvox.ApiImplementation.init(true);
+    cvox.ApiImplementation.init();
     return;
   }
 
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
index 64392049..37adcc68 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
@@ -2708,6 +2708,12 @@
       <message desc="Describes an audio clip that gets played for a specific event or control type. Use the default string as a guide to what the audio clip represents or conveys." name="IDS_CHROMEVOX_WRAP_EARCON_DESCRIPTION">
         Wrap from beginning to end or end to beginning inside of a page, dialog, or other container
       </message>
+      <message desc="Describes a command to turn off the visual display for accessibility without impacting usage of the machine." name="IDS_CHROMEVOX_DARKEN_SCREEN">
+        Darken screen
+      </message>
+      <message desc="Describes a command to turn the visual display on for accessibility undoing any previous request to turn off the visual display." name="IDS_CHROMEVOX_UNDARKEN_SCREEN">
+        Undarken screen
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/chrome/browser/resources/chromeos/chromevox/tools/check_chromevox.py b/chrome/browser/resources/chromeos/chromevox/tools/check_chromevox.py
index 884bd62..f78f0d24 100755
--- a/chrome/browser/resources/chromeos/chromevox/tools/check_chromevox.py
+++ b/chrome/browser/resources/chromeos/chromevox/tools/check_chromevox.py
@@ -41,6 +41,11 @@
   return os.path.relpath(os.path.join(_CHROME_SOURCE_DIR, path))
 
 
+# AccessibilityPrivate externs file.
+_ACCESSIBILITY_PRIVATE_EXTERNS = (
+    ChromeRootPath(
+        'third_party/closure_compiler/externs/accessibility_private.js'))
+
 # Automation API externs file.
 _AUTOMATION_EXTERNS = (
     ChromeRootPath('third_party/closure_compiler/externs/automation.js'))
@@ -61,6 +66,7 @@
     CVoxPath('chromevox/background/externs.js'),
     CVoxPath('chromevox/injected/externs.js'),
     CVoxPath('host/chrome/externs.js'),
+    _ACCESSIBILITY_PRIVATE_EXTERNS,
     _AUTOMATION_EXTERNS,
     _CHROME_EXTENSIONS_EXTERNS,
     _METRICS_PRIVATE_EXTERNS]
diff --git a/chrome/browser/resources/chromeos/switch_access/BUILD.gn b/chrome/browser/resources/chromeos/switch_access/BUILD.gn
index b40eaf9f..cdfec47 100644
--- a/chrome/browser/resources/chromeos/switch_access/BUILD.gn
+++ b/chrome/browser/resources/chromeos/switch_access/BUILD.gn
@@ -25,6 +25,11 @@
   mode = "copy"
   dest_dir = switch_access_dir
   sources = [
+    "background.js",
+    "options.css",
+    "options.html",
+    "options.js",
+    "prefs.js",
     "switch_access.js",
   ]
   rewrite_rules = [
diff --git a/chrome/browser/resources/chromeos/switch_access/background.js b/chrome/browser/resources/chromeos/switch_access/background.js
new file mode 100644
index 0000000..4d6304d
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/background.js
@@ -0,0 +1,10 @@
+// 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.
+
+/**
+ * Initializes SwitchAccess and adds it to the extension's background page.
+ *
+ * @type {SwitchAccess}
+ */
+window.switchAccess = new SwitchAccess();
diff --git a/chrome/browser/resources/chromeos/switch_access/compiled_resources2.gyp b/chrome/browser/resources/chromeos/switch_access/compiled_resources2.gyp
index c070260b..8bfd24c 100644
--- a/chrome/browser/resources/chromeos/switch_access/compiled_resources2.gyp
+++ b/chrome/browser/resources/chromeos/switch_access/compiled_resources2.gyp
@@ -5,11 +5,38 @@
 {
   'targets': [
     {
+      'target_name': 'background',
+      'dependencies': [
+        '<(EXTERNS_GYP):chrome_extensions',
+        'prefs',
+        'switch_access',
+      ],
+      'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
+      'target_name': 'options',
+      'dependencies': [
+        '<(EXTERNS_GYP):chrome_extensions',
+        'prefs',
+        'switch_access',
+        'background',
+      ],
+      'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
+      'target_name': 'prefs',
+      'dependencies': [
+        '<(EXTERNS_GYP):chrome_extensions',
+      ],
+      'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
       'target_name': 'switch_access',
       'dependencies': [
         '<(EXTERNS_GYP):accessibility_private',
-	'<(EXTERNS_GYP):automation',
-	'<(EXTERNS_GYP):chrome_extensions',
+        '<(EXTERNS_GYP):automation',
+        '<(EXTERNS_GYP):chrome_extensions',
+        'prefs',
       ],
       'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
diff --git a/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2 b/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2
index 2ad774dd..2f1d3636 100644
--- a/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2
+++ b/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2
@@ -11,11 +11,15 @@
 {% endif %}
   "background": {
     "scripts": [
-      "switch_access.js"
+      "prefs.js",
+      "switch_access.js",
+      "background.js"
     ]
   },
   "permissions": [
-    "accessibilityPrivate"
+    "accessibilityPrivate",
+    "storage",
+    "tabs"
   ],
   "automation": {
     "desktop": true
diff --git a/chrome/browser/resources/chromeos/switch_access/options.css b/chrome/browser/resources/chromeos/switch_access/options.css
new file mode 100644
index 0000000..fc8d090
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/options.css
@@ -0,0 +1,8 @@
+/* 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. */
+
+#autoScanTimeLabel * {
+  clear: left;
+  float: left;
+}
diff --git a/chrome/browser/resources/chromeos/switch_access/options.html b/chrome/browser/resources/chromeos/switch_access/options.html
new file mode 100644
index 0000000..ab5ddc8a
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/options.html
@@ -0,0 +1,29 @@
+<!-- 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. -->
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Switch Access Options</title>
+  <link href="options.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+  <h1>Switch Access Options</h1>
+  <h2>Auto-Scan</h2>
+  <div>
+    <label>
+      <input id="enableAutoScan" type="checkbox">
+      Enable auto-scan
+    </label>
+  </div>
+  <div>
+    <!-- TODO(elichtenberg) i18n for pref ids -->
+    <label id="autoScanTimeLabel">
+      <span>Set auto-scan time in seconds:</span>
+      <input id="autoScanTime" type="number" min=".05" step=".05" value="1">
+    </label>
+  </div>
+  <script type="text/javascript" src="options.js"></script>
+</body>
+</html>
+
diff --git a/chrome/browser/resources/chromeos/switch_access/options.js b/chrome/browser/resources/chromeos/switch_access/options.js
new file mode 100644
index 0000000..9d59dd6e
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/options.js
@@ -0,0 +1,89 @@
+// 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.
+
+/**
+ * Alias for document.getElementById.
+ *
+ * @param  {string} id
+ * @return {Element}
+ */
+let $ = function(id) {
+  return document.getElementById(id);
+};
+
+/**
+ * Class to manage the options page.
+ *
+ * @constructor
+ */
+let SwitchAccessOptions = function() {
+  let background = chrome.extension.getBackgroundPage();
+
+  /**
+   * User preferences.
+   *
+   * @type {SwitchAccessPrefs}
+   */
+  this.switchAccessPrefs_ = background.switchAccess.switchAccessPrefs;
+
+  this.init_();
+  document.addEventListener('change', this.handleInputChange_.bind(this));
+  background.document.addEventListener(
+      'prefsUpdate', this.handlePrefsUpdate_.bind(this));
+};
+
+SwitchAccessOptions.prototype = {
+  /**
+   * Initialize the options page by setting all elements representing a user
+   * preference to show the correct value.
+   *
+   * @private
+   */
+  init_: function() {
+    let prefs = this.switchAccessPrefs_.getPrefs();
+    $('enableAutoScan').checked = prefs['enableAutoScan'];
+    $('autoScanTime').value = prefs['autoScanTime'];
+  },
+
+  /**
+   * Handle a change by the user to an element representing a user preference.
+   *
+   * @param {!Event} event
+   * @private
+   */
+  handleInputChange_: function(event) {
+    switch (event.target.id) {
+      case 'enableAutoScan':
+        this.switchAccessPrefs_.setPref(event.target.id, event.target.checked);
+        break;
+      case 'autoScanTime':
+        this.switchAccessPrefs_.setPref(event.target.id, event.target.value);
+        break;
+    }
+  },
+
+  /**
+   * Handle a change in user preferences.
+   *
+   * @param {!Event} event
+   * @private
+   */
+  handlePrefsUpdate_: function(event) {
+    let updatedPrefs = event.detail;
+    for (let key of Object.keys(updatedPrefs)) {
+      switch (key) {
+        case 'enableAutoScan':
+          $(key).checked = updatedPrefs[key];
+          break;
+        case 'autoScanTime':
+          $(key).value = updatedPrefs[key];
+          break;
+      }
+    }
+  }
+};
+
+document.addEventListener('DOMContentLoaded', function() {
+  new SwitchAccessOptions();
+});
diff --git a/chrome/browser/resources/chromeos/switch_access/prefs.js b/chrome/browser/resources/chromeos/switch_access/prefs.js
new file mode 100644
index 0000000..bbe21bd
--- /dev/null
+++ b/chrome/browser/resources/chromeos/switch_access/prefs.js
@@ -0,0 +1,91 @@
+// 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.
+
+/**
+ * Class to manage user preferences.
+ *
+ * @constructor
+ */
+let SwitchAccessPrefs = function() {
+  /**
+   * User preferences, initially set to the default preference values.
+   *
+   * @private
+   */
+  this.prefs_ = Object.assign({}, this.DEFAULT_PREFS);
+  this.loadPrefs_();
+  chrome.storage.onChanged.addListener(this.handleStorageChange_.bind(this));
+};
+
+SwitchAccessPrefs.prototype = {
+  /**
+   * Asynchronously load the current preferences from chrome.storage.sync and
+   * store them in this.prefs_.
+   *
+   * @private
+   */
+  loadPrefs_: function() {
+    let defaultKeys = Object.keys(this.DEFAULT_PREFS);
+    chrome.storage.sync.get(defaultKeys, function(loadedPrefs) {
+      let loadedKeys = Object.keys(loadedPrefs);
+      if (loadedKeys.length > 0) {
+        for (let key of loadedKeys) {
+          this.prefs_[key] = loadedPrefs[key];
+        }
+        let event = new CustomEvent('prefsUpdate', {'detail': loadedPrefs});
+        document.dispatchEvent(event);
+      }
+    }.bind(this));
+  },
+
+  /**
+   * Store any changes to chrome.storage.sync in this.prefs_.
+   *
+   * @param {!Object} changes
+   * @param {string} areaName
+   * @private
+   */
+  handleStorageChange_: function(changes, areaName) {
+    for (let key of Object.keys(changes)) {
+      // If pref change happened on same device, prefs will already be updated,
+      // so this will have no effect.
+      this.prefs_[key] = changes[key].newValue;
+      changes[key] = changes[key].newValue;
+    }
+
+    let event = new CustomEvent('prefsUpdate', {'detail': changes});
+    document.dispatchEvent(event);
+  },
+
+  /**
+   * Set the value of the preference |key| to |value|.
+   *
+   * @param {string} key
+   * @param {boolean|string|number} value
+   */
+  setPref: function(key, value) {
+    let pref = {};
+    pref[key] = value;
+    chrome.storage.sync.set(pref);
+    this.prefs_[key] = value;
+  },
+
+  /**
+   * Get all user preferences.
+   */
+  getPrefs: function() {
+    return Object.assign({}, this.prefs_);
+  },
+
+  /**
+   * The default value of all preferences. All preferences should be primitives
+   * to prevent changes to default values.
+   *
+   * @const
+   */
+  DEFAULT_PREFS: {
+    'enableAutoScan': false,
+    'autoScanTime': .75
+  }
+};
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access.js b/chrome/browser/resources/chromeos/switch_access/switch_access.js
index 6333888..a80dcc3 100644
--- a/chrome/browser/resources/chromeos/switch_access/switch_access.js
+++ b/chrome/browser/resources/chromeos/switch_access/switch_access.js
@@ -5,73 +5,100 @@
 let AutomationNode = chrome.automation.AutomationNode;
 
 let debuggingEnabled = true;
+
 /**
  * @constructor
  */
 let SwitchAccess = function() {
   console.log('Switch access is enabled');
 
-  // Currently selected node.
-  /** @private {AutomationNode} */
+  /**
+   * User preferences.
+   *
+   * @type {SwitchAccessPrefs}
+   */
+  this.switchAccessPrefs = null;
+
+  /**
+   * Currently selected node.
+   *
+   * @private {AutomationNode}
+   */
   this.node_ = null;
 
-  // Root node (i.e., the desktop).
-  /** @private {AutomationNode} */
+  /**
+   * Root node (i.e., the desktop).
+   *
+   * @private {AutomationNode}
+   */
   this.root_ = null;
 
-  // List of nodes to push to / pop from in case this.node_ is lost.
-  /** @private {!Array<!AutomationNode>} */
-  this.ancestorList_ = [];
-
-  chrome.automation.getDesktop(function(desktop) {
-    this.node_ = desktop;
-    this.root_ = desktop;
-    console.log('AutomationNode for desktop is loaded');
-    this.printDetails_();
-
-    document.addEventListener('keyup', function(event) {
-      switch (event.key) {
-        case '1':
-          console.log('1 = go to previous element');
-          this.moveToPrevious_();
-          break;
-        case '2':
-          console.log('2 = go to next element');
-          this.moveToNext_();
-          break;
-        case '3':
-          console.log('3 = do default on element');
-          this.doDefault_();
-          break;
-      }
-      if (debuggingEnabled) {
-        switch (event.key) {
-          case '6':
-            console.log('6 = go to previous element (debug mode)');
-            this.debugMoveToPrevious_();
-            break;
-          case '7':
-            console.log('7 = go to next element (debug mode)');
-            this.debugMoveToNext_();
-            break;
-          case '8':
-            console.log('8 = go to child element (debug mode)');
-            this.debugMoveToFirstChild_();
-            break;
-          case '9':
-            console.log('9 = go to parent element (debug mode)');
-            this.debugMoveToParent_();
-            break;
-        }
-      }
-      if (this.node_)
-        chrome.accessibilityPrivate.setFocusRing([this.node_.location]);
-    }.bind(this));
-  }.bind(this));
+  this.init_();
 };
 
 SwitchAccess.prototype = {
   /**
+   * Set this.node_ and this.root_ to the desktop node, and set up preferences
+   * and event listeners.
+   *
+   * @private
+   */
+  init_: function() {
+    this.switchAccessPrefs = new SwitchAccessPrefs();
+
+    chrome.automation.getDesktop(function(desktop) {
+      this.node_ = desktop;
+      this.root_ = desktop;
+      console.log('AutomationNode for desktop is loaded');
+      this.printNode_(this.node_);
+
+      document.addEventListener('keyup', function(event) {
+        switch (event.key) {
+          case '1':
+            console.log('1 = go to previous element');
+            this.moveToPrevious_();
+            break;
+          case '2':
+            console.log('2 = go to next element');
+            this.moveToNext_();
+            break;
+          case '3':
+            console.log('3 = do default on element');
+            this.doDefault_();
+            break;
+          case '4':
+            this.showOptionsPage_();
+            break;
+        }
+        if (debuggingEnabled) {
+          switch (event.key) {
+            case '6':
+              console.log('6 = go to previous element (debug mode)');
+              this.debugMoveToPrevious_();
+              break;
+            case '7':
+              console.log('7 = go to next element (debug mode)');
+              this.debugMoveToNext_();
+              break;
+            case '8':
+              console.log('8 = go to child element (debug mode)');
+              this.debugMoveToFirstChild_();
+              break;
+            case '9':
+              console.log('9 = go to parent element (debug mode)');
+              this.debugMoveToParent_();
+              break;
+          }
+        }
+        if (this.node_)
+          chrome.accessibilityPrivate.setFocusRing([this.node_.location]);
+      }.bind(this));
+    }.bind(this));
+
+    document.addEventListener('prefsUpdate', this.handlePrefsUpdate_);
+  },
+
+  /**
    * Set this.node_ to the previous interesting node. If no interesting node
    * comes before this.node_, set this.node_ to the last interesting node.
    *
@@ -227,79 +254,6 @@
     return node.state && node.state.focusable;
   },
 
-  /**
-   * Move to the previous sibling of this.node_ if it has one.
-   *
-   * @private
-   */
-  debugMoveToPrevious_: function() {
-    let previous = this.node_.previousSibling;
-    if (previous) {
-      this.node_ = previous;
-      this.printDetails_();
-    } else {
-      console.log('Node is first of siblings');
-      console.log('\n');
-    }
-  },
-
-  /**
-   * Move to the next sibling of this.node_ if it has one.
-   *
-   * @private
-   */
-  debugMoveToNext_: function() {
-    let next = this.node_.nextSibling;
-    if (next) {
-      this.node_ = next;
-      this.printDetails_();
-    } else {
-      console.log('Node is last of siblings');
-      console.log('\n');
-    }
-  },
-
-  /**
-   * Move to the first child of this.node_ if it has one.
-   *
-   * @private
-   */
-  debugMoveToFirstChild_: function() {
-    let child = this.node_.firstChild;
-    if (child) {
-      this.ancestorList_.push(this.node_);
-      this.node_ = child;
-      this.printDetails_();
-    } else {
-      console.log('Node has no children');
-      console.log('\n');
-    }
-  },
-
-  /**
-   * Move to the parent of this.node_ if it has one. If it does not have a
-   * parent but it is not the top level root node, then this.node_ lost track of
-   * its neighbors, and we move to an ancestor node.
-   *
-   * @private
-   */
-  debugMoveToParent_: function() {
-    let parent = this.node_.parent;
-    if (parent) {
-      this.ancestorList_.pop();
-      this.node_ = parent;
-      this.printDetails_();
-    } else if (this.ancestorList_.length === 0) {
-      console.log('Node has no parent');
-      console.log('\n');
-    } else {
-      console.log(
-          'Node could not find its parent, so moved to recent ancestor');
-      let ancestor = this.ancestorList_.pop();
-      this.node_ = ancestor;
-      this.printDetails_();
-    }
-  },
 
   /**
    * Perform the default action on the currently selected node.
@@ -318,21 +272,40 @@
     this.node_.doDefault();
   },
 
-  // TODO(elichtenberg): Move print functions to a custom logger class. Only
-  // log when debuggingEnabled is true.
   /**
-   * Print out details about the currently selected node and the list of
-   * ancestors.
+   * Open the options page in a new tab.
    *
    * @private
    */
-  printDetails_: function() {
-    this.printNode_(this.node_);
-    console.log(this.ancestorList_);
-    console.log('\n');
+  showOptionsPage_: function() {
+    let optionsPage = {url: 'options.html'};
+    chrome.tabs.create(optionsPage);
   },
 
   /**
+   * Handle a change in user preferences.
+   *
+   * @param {!Event} event
+   * @private
+   */
+  handlePrefsUpdate_: function(event) {
+    let updatedPrefs = event.detail;
+    for (let key of Object.keys(updatedPrefs)) {
+      switch (key) {
+        case 'enableAutoScan':
+          console.log('Auto-scan enabled set to: ' + updatedPrefs[key]);
+          break;
+        case 'autoScanTime':
+          console.log(
+              'Auto-scan time set to: ' + updatedPrefs[key] + " seconds");
+          break;
+      }
+    }
+  },
+
+  // TODO(elichtenberg): Move print functions to a custom logger class. Only
+  // log when debuggingEnabled is true.
+  /**
    * Print out details about a node.
    *
    * @param {AutomationNode} node
@@ -356,7 +329,69 @@
     }
     console.log(node);
     console.log('\n');
+  },
+
+  /**
+   * Move to the previous sibling of this.node_ if it has one.
+   *
+   * @private
+   */
+  debugMoveToPrevious_: function() {
+    let previous = this.node_.previousSibling;
+    if (previous) {
+      this.node_ = previous;
+      this.printNode_(this.node_);
+    } else {
+      console.log('Node is first of siblings');
+      console.log('\n');
+    }
+  },
+
+  /**
+   * Move to the next sibling of this.node_ if it has one.
+   *
+   * @private
+   */
+  debugMoveToNext_: function() {
+    let next = this.node_.nextSibling;
+    if (next) {
+      this.node_ = next;
+      this.printNode_(this.node_);
+    } else {
+      console.log('Node is last of siblings');
+      console.log('\n');
+    }
+  },
+
+  /**
+   * Move to the first child of this.node_ if it has one.
+   *
+   * @private
+   */
+  debugMoveToFirstChild_: function() {
+    let child = this.node_.firstChild;
+    if (child) {
+      this.node_ = child;
+      this.printNode_(this.node_);
+    } else {
+      console.log('Node has no children');
+      console.log('\n');
+    }
+  },
+
+  /**
+   * Move to the parent of this.node_ if it has one.
+   *
+   * @private
+   */
+  debugMoveToParent_: function() {
+    let parent = this.node_.parent;
+    if (parent) {
+      this.node_ = parent;
+      this.printNode_(this.node_);
+    } else {
+      console.log('Node has no parent');
+      console.log('\n');
+    }
   }
 };
-
-window.switchAccess = new SwitchAccess();
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access_unittest.gtestjs b/chrome/browser/resources/chromeos/switch_access/switch_access_unittest.gtestjs
index 5ed07b0..4536781 100644
--- a/chrome/browser/resources/chromeos/switch_access/switch_access_unittest.gtestjs
+++ b/chrome/browser/resources/chromeos/switch_access/switch_access_unittest.gtestjs
@@ -17,6 +17,7 @@
   /** @override */
   extraLibraries: [
     'test_support.js',
+    'prefs.js',
     'switch_access.js',
     'testable_switch_access.js',
   ],
diff --git a/chrome/browser/resources/chromeos/switch_access/test_support.js b/chrome/browser/resources/chromeos/switch_access/test_support.js
index ef7f228..51f0e823 100644
--- a/chrome/browser/resources/chromeos/switch_access/test_support.js
+++ b/chrome/browser/resources/chromeos/switch_access/test_support.js
@@ -7,7 +7,3 @@
  * SwitchAccessUnitTest can load.
  */
 chrome.automation = {};
-
-chrome.automation.getDesktop = function() {};
-
-window = {};
diff --git a/chrome/browser/resources/chromeos/switch_access/testable_switch_access.js b/chrome/browser/resources/chromeos/switch_access/testable_switch_access.js
index 83777034..c5cdde7 100644
--- a/chrome/browser/resources/chromeos/switch_access/testable_switch_access.js
+++ b/chrome/browser/resources/chromeos/switch_access/testable_switch_access.js
@@ -12,6 +12,8 @@
 TestableSwitchAccess.prototype = {
   __proto__: SwitchAccess.prototype,
 
+  init_: function() {},
+
   getNextNode: function(node) {
     return this.getNextNode_(node);
   },
diff --git a/chrome/browser/resources/md_extensions/code_section.html b/chrome/browser/resources/md_extensions/code_section.html
index 207eb1540..88d32c6 100644
--- a/chrome/browser/resources/md_extensions/code_section.html
+++ b/chrome/browser/resources/md_extensions/code_section.html
@@ -40,7 +40,7 @@
         text-align: center;
       }
     </style>
-    <div id="main" hidden$="[[isMainHidden_(code)]]">
+    <div id="main" hidden$="[[isEmpty(code)]]">
       <div id="line-numbers">
         <span>[[computeLineNumbersContent_(code.*)]]</span>
       </div>
@@ -51,7 +51,7 @@
      --></span>[[code.afterHighlight]]</span>
       </div>
     </div>
-    <div id="no-code" hidden$="[[!isMainHidden_(code)]]">[[noCodeError]]</div>
+    <div id="no-code" hidden$="[[!isEmpty(code)]]">[[couldNotDisplayCode]]</div>
   </template>
   <script src="chrome://extensions/code_section.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/md_extensions/code_section.js b/chrome/browser/resources/md_extensions/code_section.js
index d0a93e2..502c86d 100644
--- a/chrome/browser/resources/md_extensions/code_section.js
+++ b/chrome/browser/resources/md_extensions/code_section.js
@@ -21,10 +21,22 @@
       },
 
       /**
-       * The string to display if no code is set.
+       * The string to display if no |code| is set (e.g. because we couldn't
+       * load the relevant source file).
        * @type {string}
        */
-      noCodeError: String,
+      couldNotDisplayCode: String,
+    },
+
+    /**
+     * Returns true if no code could be displayed (e.g. because the file could
+     * not be loaded).
+     * @return {boolean}
+     */
+    isEmpty: function() {
+      return !this.code ||
+             (!this.code.beforeHighlight && !this.code.highlight &&
+              !this.code.afterHighlight);
     },
 
     /**
@@ -46,14 +58,6 @@
         textContent += i + '\n';
       return textContent;
     },
-
-    /**
-     * @return {boolean}
-     * @private
-     */
-    isMainHidden_: function() {
-      return !this.code;
-    },
   });
 
   return {CodeSection: CodeSection};
diff --git a/chrome/browser/resources/md_extensions/compiled_resources2.gyp b/chrome/browser/resources/md_extensions/compiled_resources2.gyp
index 3ca03af..90c0c00 100644
--- a/chrome/browser/resources/md_extensions/compiled_resources2.gyp
+++ b/chrome/browser/resources/md_extensions/compiled_resources2.gyp
@@ -117,6 +117,7 @@
       'dependencies': [
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:assert',
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
+        '<(EXTERNS_GYP):developer_private',
       ],
       'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
diff --git a/chrome/browser/resources/md_extensions/error_page.html b/chrome/browser/resources/md_extensions/error_page.html
index 8b1d1973..10bcd50 100644
--- a/chrome/browser/resources/md_extensions/error_page.html
+++ b/chrome/browser/resources/md_extensions/error_page.html
@@ -84,7 +84,7 @@
       </iron-list>
       <div id="content-view">
         <extensions-code-section id="code-section"
-            no-code-error="$i18n{noErrorsToShow}">
+            could-not-display-code="$i18n{noErrorsToShow}">
         </extensions-code-section>
       </div>
       <div id="devtools-controls">
diff --git a/chrome/browser/resources/md_extensions/load_error.html b/chrome/browser/resources/md_extensions/load_error.html
index 9d6a00c..c2fd7d1 100644
--- a/chrome/browser/resources/md_extensions/load_error.html
+++ b/chrome/browser/resources/md_extensions/load_error.html
@@ -5,6 +5,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/shadow.html">
+<link rel="import" href="chrome://extensions/code_section.html">
 
 <dom-module id="extensions-load-error">
   <template>
@@ -93,14 +94,16 @@
         <div id="info">
           <div id="file" class="description-row">
             <span class="row-label">$i18n{loadErrorFileLabel}</span>
-            <span class="row-value">[[filePath]]</span>
+            <span class="row-value">[[loadError.path]]</span>
           </div>
           <div id="error" class="description-row">
             <span class="row-label">$i18n{loadErrorErrorLabel}</span>
-            <span class="row-value">[[error]]</span>
+            <span class="row-value">[[loadError.error]]</span>
           </div>
         </div>
-        <div id="extension-code"></div>
+        <extensions-code-section id="code"
+            could-not-display-code="$i18n{loadErrorCouldNotLoadManifest}">
+        </extensions-code-section>
       </div>
       <div id="buttons-container">
         <paper-button id="dismiss" on-tap="close">
diff --git a/chrome/browser/resources/md_extensions/load_error.js b/chrome/browser/resources/md_extensions/load_error.js
index 75b47ff..942407d 100644
--- a/chrome/browser/resources/md_extensions/load_error.js
+++ b/chrome/browser/resources/md_extensions/load_error.js
@@ -19,11 +19,14 @@
       /** @type {extensions.LoadErrorDelegate} */
       delegate: Object,
 
-      error: String,
-
-      filePath: String,
+      /** @type {chrome.developerPrivate.LoadError} */
+      loadError: Object,
     },
 
+    observers: [
+      'observeLoadErrorChanges_(loadError)',
+    ],
+
     show: function() {
       this.$$('dialog').showModal();
     },
@@ -37,6 +40,25 @@
       this.delegate.retryLoadUnpacked();
       this.close();
     },
+
+    /** @private */
+    observeLoadErrorChanges_: function() {
+      assert(this.loadError);
+      var source = this.loadError.source;
+      // CodeSection expects a RequestFileSourceResponse, rather than an
+      // ErrorFileSource. Massage into place.
+      // TODO(devlin): Make RequestFileSourceResponse use ErrorFileSource.
+      /** @type {!chrome.developerPrivate.RequestFileSourceResponse} */
+      var codeSectionProperties = {
+        beforeHighlight: source ? source.beforeHighlight : '',
+        highlight: source ? source.highlight : '',
+        afterHighlight: source ? source.afterHighlight : '',
+        title: '',
+        message: this.loadError.error,
+      };
+
+      this.$.code.code = codeSectionProperties;
+    },
   });
 
   return {LoadError: LoadError,
diff --git a/chrome/browser/resources/md_extensions/service.js b/chrome/browser/resources/md_extensions/service.js
index c3f9d52..eec87f9e 100644
--- a/chrome/browser/resources/md_extensions/service.js
+++ b/chrome/browser/resources/md_extensions/service.js
@@ -253,8 +253,18 @@
 
     /** @override */
     loadUnpacked: function() {
-      chrome.developerPrivate.loadUnpacked({failQuietly: true}, () => {
-        // TODO(devlin): Show the load error dialog if something went wrong.
+      chrome.developerPrivate.loadUnpacked(
+          {failQuietly: true, populateError: true},
+          (loadError) => {
+        if (chrome.runtime.lastError &&
+            chrome.runtime.lastError.message !=
+                'File selection was canceled.') {
+          throw new Error(chrome.runtime.lastError.message);
+        }
+        if (loadError) {
+          this.manager_.loadError.set('loadError', loadError);
+          this.manager_.loadError.show();
+        }
       });
     },
 
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js b/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js
index b139a7f..65b76980 100644
--- a/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js
+++ b/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js
@@ -28,6 +28,12 @@
 // <if expr="is_linux and not chromeos">
     useSystemTheme: assertNotReached,
 // </if>
+
+    /**
+     * @param {string} url The url of which to check validity.
+     * @return {!Promise<boolean>}
+     */
+    validateStartupPage: assertNotReached,
   };
 
   /**
@@ -76,6 +82,11 @@
       chrome.send('useSystemTheme');
     },
 // </if>
+
+    /** @override */
+    validateStartupPage: function(url) {
+      return cr.sendWithPromise('validateStartupPage', url);
+    },
   };
 
   return {
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.html b/chrome/browser/resources/settings/appearance_page/appearance_page.html
index f741a59..bdc12b12 100644
--- a/chrome/browser/resources/settings/appearance_page/appearance_page.html
+++ b/chrome/browser/resources/settings/appearance_page/appearance_page.html
@@ -26,8 +26,14 @@
         -webkit-margin-start: 12px;
       }
 
+      #custom-input {
+        margin-bottom: 1rem;
+      }
+
       #customHomePage {
-        width: 200px;
+        --paper-input-container: {
+          width: 200px;
+        };
       }
     </style>
     <settings-animated-pages id="pages" section="appearance">
@@ -112,17 +118,18 @@
                   pref="[[prefs.homepage_is_newtabpage]]"
                   label="$i18n{homePageNtp}" no-extension-indicator>
               </controlled-radio-button>
-              <controlled-radio-button class="list-item" name="false"
-                  pref="[[prefs.homepage_is_newtabpage]]"
+              <controlled-radio-button id="custom-input" class="list-item"
+                  name="false" pref="[[prefs.homepage_is_newtabpage]]"
                   no-extension-indicator>
                 <!-- TODO(dbeam): this can show double indicators when both
                      homepage and whether to use the NTP as the homepage are
                      managed. -->
-                <settings-input id="customHomePage"
-                    no-label-float pref="{{prefs.homepage}}"
+                <settings-input id="customHomePage" pref="{{prefs.homepage}}"
                     label="$i18n{enterCustomWebAddress}"
                     can-tab="[[!prefs.homepage_is_newtabpage.value]]"
-                    stop-keyboard-event-propagation no-extension-indicator>
+                    no-extension-indicator
+                    error-message="$i18n{notValid}"
+                    on-input="validate_" invalid="{{isHomeUrlInvalid_}}">
                 </settings-input>
               </controlled-radio-button>
               <template is="dom-if" if="[[prefs.homepage.extensionId]]">
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.js b/chrome/browser/resources/settings/appearance_page/appearance_page.js
index cec6424..4eece5c 100644
--- a/chrome/browser/resources/settings/appearance_page/appearance_page.js
+++ b/chrome/browser/resources/settings/appearance_page/appearance_page.js
@@ -52,6 +52,9 @@
       },
     },
 
+    /** @private */
+    isHomeUrlInvalid_: Boolean,
+
     /**
      * List of options for the page zoom drop-down menu.
      * @type {!Array<number>}
@@ -158,7 +161,7 @@
     window.open(this.themeUrl_ || loadTimeData.getString('themesGalleryUrl'));
   },
 
-// <if expr="chromeos">
+  // <if expr="chromeos">
   /**
    * ChromeOS only.
    * @private
@@ -166,14 +169,14 @@
   openWallpaperManager_: function() {
     this.browserProxy_.openWallpaperManager();
   },
-// </if>
+  // </if>
 
   /** @private */
   onUseDefaultTap_: function() {
     this.browserProxy_.useDefaultTheme();
   },
 
-// <if expr="is_linux and not chromeos">
+  // <if expr="is_linux and not chromeos">
   /**
    * @param {boolean} useSystemTheme
    * @private
@@ -218,7 +221,7 @@
   onUseSystemTap_: function() {
     this.browserProxy_.useSystemTheme();
   },
-// </if>
+  // </if>
 
   /**
    * @param {string} themeId
@@ -272,4 +275,22 @@
   zoomValuesEqual_: function(zoom1, zoom2) {
     return Math.abs(zoom1 - zoom2) <= 0.001;
   },
+
+  /**
+   * @param {!Event} event
+   * @private
+   */
+  validate_: function(event) {
+    var inputElement = Polymer.dom(event).localTarget;
+
+    if (inputElement.value == '') {
+      this.isHomeUrlInvalid_ = false;
+      return;
+    }
+
+    this.browserProxy_.validateStartupPage(inputElement.value)
+        .then(function(isValid) {
+          this.isHomeUrlInvalid_ = !isValid;
+        }.bind(this));
+  },
 });
diff --git a/chrome/browser/resources/settings/controls/settings_input.html b/chrome/browser/resources/settings/controls/settings_input.html
index 0ebc114..de07745c 100644
--- a/chrome/browser/resources/settings/controls/settings_input.html
+++ b/chrome/browser/resources/settings/controls/settings_input.html
@@ -15,13 +15,10 @@
       }
     </style>
     <div id="outerDiv" class="layout horizontal center">
-      <paper-input id="input" auto-validate value="{{value}}"
-          error-message="[[errorMessage]]" label="[[label]]"
-          no-label-float="[[noLabelFloat]]" pattern="[[pattern]]"
-          readonly$="[[readonly]]" required="[[required]]" type="[[type]]"
-          on-change="onChange_" on-keydown="onKeydown_"
-          disabled="[[isDisabled_(disabled, pref.*)]]"
-          stop-keyboard-event-propagation$="[[stopKeyboardEventPropagation]]"
+      <paper-input id="input" value="{{value}}" no-label-float label="[[label]]"
+          error-message="[[errorMessage]]" on-change="onChange_"
+          on-keydown="onKeydown_" disabled="[[isDisabled_(disabled, pref.*)]]"
+          stop-keyboard-event-propagation invalid="{{invalid}}"
           tabindex$="[[getTabindex_(canTab)]]">
       </paper-input>
       <template is="dom-if" if="[[hasPrefPolicyIndicator(pref.*)]]">
diff --git a/chrome/browser/resources/settings/controls/settings_input.js b/chrome/browser/resources/settings/controls/settings_input.js
index ea075476..3796fdec 100644
--- a/chrome/browser/resources/settings/controls/settings_input.js
+++ b/chrome/browser/resources/settings/controls/settings_input.js
@@ -18,9 +18,7 @@
      * @type {!chrome.settingsPrivate.PrefObject|undefined}
      * @override
      */
-    pref: {
-      observer: 'prefChanged_'
-    },
+    pref: {observer: 'prefChanged_'},
 
     /* The current value of the input, reflected to/from |pref|. */
     value: {
@@ -30,24 +28,20 @@
     },
 
     /* Set to true to disable editing the input. */
-    disabled: {
-      type: Boolean,
-      value: false,
-      reflectToAttribute: true
-    },
+    disabled: {type: Boolean, value: false, reflectToAttribute: true},
 
     canTab: Boolean,
 
+    invalid: {
+      type: Boolean,
+      value: false,
+      notify: true,
+    },
+
     /* Properties for paper-input. This is not strictly necessary.
      * Though it does define the types for the closure compiler. */
-    errorMessage: { type: String },
-    label: { type: String },
-    noLabelFloat: { type: Boolean, value: false },
-    pattern: { type: String },
-    readonly: { type: Boolean, value: false },
-    required: { type: Boolean, value: false },
-    stopKeyboardEventPropagation: { type: Boolean, value: false },
-    type: { type: String },
+    errorMessage: {type: String},
+    label: {type: String},
   },
 
   /**
@@ -75,13 +69,8 @@
 
   /** @private */
   setInputValueFromPref_: function() {
-    if (this.pref.type == chrome.settingsPrivate.PrefType.NUMBER) {
-      this.value = this.pref.value.toString();
-    } else {
-      assert(this.pref.type == chrome.settingsPrivate.PrefType.STRING ||
-             this.pref.type == chrome.settingsPrivate.PrefType.URL);
-      this.value = /** @type {string} */(this.pref.value);
-    }
+    assert(this.pref.type == chrome.settingsPrivate.PrefType.URL);
+    this.value = /** @type {string} */ (this.pref.value);
   },
 
   /**
@@ -100,39 +89,38 @@
    * @private
    */
   onChange_: function() {
-    if (!this.pref)
+    if (this.invalid) {
+      this.resetValue_();
       return;
-
-    if (this.pref.type == chrome.settingsPrivate.PrefType.NUMBER) {
-      if (!this.value) {
-        // Ignore empty input field and restore value.
-        this.value = this.pref.value.toString();
-        return;
-      }
-      var n = parseInt(this.value, 10);
-      if (isNaN(n)) {
-        console.error('Bad value for numerical pref: ' + this.value);
-        return;
-      }
-      this.set('pref.value', n);
-    } else {
-      assert(this.pref.type == chrome.settingsPrivate.PrefType.STRING ||
-             this.pref.type == chrome.settingsPrivate.PrefType.URL);
-      this.set('pref.value', this.value);
     }
+
+    assert(this.pref.type == chrome.settingsPrivate.PrefType.URL);
+    this.set('pref.value', this.value);
+  },
+
+  /** @private */
+  resetValue_: function() {
+    this.invalid = false;
+    this.setInputValueFromPref_();
+    this.$.input.blur();
   },
 
   /**
-   * Handler for profile name keydowns.
+   * Keydown handler to specify enter-key and escape-key interactions.
    * @param {!Event} event
    * @private
    */
   onKeydown_: function(event) {
+    // If pressed enter when input is invalid, do not trigger on-change.
+    if (event.key == 'Enter' && this.invalid) {
+      event.preventDefault();
+      return;
+    }
+
     if (event.key != 'Escape')
       return;
 
-    this.setInputValueFromPref_();
-    this.$.input.blur();
+    this.resetValue_();
   },
 
   /**
diff --git a/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.html b/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.html
index d1f4c8c..d749e17 100644
--- a/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.html
+++ b/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.html
@@ -23,18 +23,18 @@
       <div class="body" on-keypress="onKeypress_">
         <paper-input always-float-label id="searchEngine"
             label="$i18n{searchEnginesSearchEngine}"
-            error-message="$i18n{searchEnginesNotValid}"
+            error-message="$i18n{notValid}"
             value="{{searchEngine_}}" on-input="validate_"
             autofocus>
         </paper-input>
         <paper-input always-float-label id="keyword"
             label="$i18n{searchEnginesKeyword}"
-            error-message="$i18n{searchEnginesNotValid}"
+            error-message="$i18n{notValid}"
             value="{{keyword_}}" on-focus="validate_" on-input="validate_">
         </paper-input>
         <paper-input always-float-label id="queryUrl"
             label="$i18n{searchEnginesQueryURLExplanation}"
-            error-message="$i18n{searchEnginesNotValid}"
+            error-message="$i18n{notValid}"
             value="{{queryUrl_}}" on-focus="validate_" on-input="validate_"
             disabled$="[[model.urlLocked]]">
         </paper-input>
diff --git a/chrome/browser/resources/settings/settings_page/main_page_behavior.js b/chrome/browser/resources/settings/settings_page/main_page_behavior.js
index 268f2af..56a74cd 100644
--- a/chrome/browser/resources/settings/settings_page/main_page_behavior.js
+++ b/chrome/browser/resources/settings/settings_page/main_page_behavior.js
@@ -67,13 +67,18 @@
         !!oldRoute && !!oldRoute.parent && !!oldRoute.section &&
         oldRoute.parent.section != oldRoute.section;
 
-    // Always scroll to the top if navigating from a section to the root route
-    // or when navigating to the About page.
-    if (this.scroller &&
-        ((oldRouteWasSection && newRoute == settings.Route.BASIC) ||
-         newRoute == settings.Route.ABOUT)) {
-      this.scroller.scrollTop = 0;
-      return;
+    if (this.scroller) {
+      // When navigating from a section to the root route, we just need to
+      // scroll to the top, and can early exit afterwards.
+      if (oldRouteWasSection && newRoute == settings.Route.BASIC) {
+        this.scroller.scrollTop = 0;
+        return;
+      }
+
+      // When navigating to the About page, we need to scroll to the top, and
+      // still do the rest of section management.
+      if (newRoute == settings.Route.ABOUT)
+        this.scroller.scrollTop = 0;
     }
 
     // Scroll to the section except for back/forward. Also scroll for any
diff --git a/chrome/browser/resources/settings/settings_page/settings_subpage_search.html b/chrome/browser/resources/settings/settings_page/settings_subpage_search.html
index c5b46c9..c3aacac 100644
--- a/chrome/browser/resources/settings/settings_page/settings_subpage_search.html
+++ b/chrome/browser/resources/settings/settings_page/settings_subpage_search.html
@@ -25,17 +25,6 @@
           /* Required to align the icon in |clearSearch| vertically. */
           line-height: 0;
         };
-
-        /**
-         * Kind of suck to have to hardcode these, but its necessary to
-         * make sure the conditional clear-icon will fit within input's height.
-         */
-        --paper-input-container-input: {
-          line-height: 24px;
-        };
-        --paper-input-container-label: {
-          line-height: 24px;
-        };
       }
 
       paper-icon-button {
@@ -62,17 +51,9 @@
         -webkit-appearance: none;
       }
 
-      #prompt,
       #searchInput {
         font-size: 92.3076923%;  /* To 12px from 13px. */
-      }
-
-      #prompt {
-        color: var(--paper-grey-600);
-      }
-
-      :host([has-search-text]) #prompt {
-        visibility: hidden;
+        min-height: 24px;
       }
 
       #searchInput {
@@ -86,10 +67,9 @@
     </style>
     <iron-icon id="searchIcon" icon="cr:search"></iron-icon>
     <paper-input-container no-label-float>
-      <label id="prompt">[[label]]</label>
       <input id="searchInput" type="search" on-search="onSearchTermSearch"
           on-input="onSearchTermInput" aria-labelledby="prompt" incremental
-          autofocus$="[[autofocus]]">
+          autofocus$="[[autofocus]]" placeholder="[[label]]">
       <paper-icon-button suffix icon="cr:cancel" id="clearSearch"
           on-tap="onTapClear_" title="[[clearLabel]]"
           hidden$="[[!hasSearchText]]">
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc
index e34d9d9..161de930 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service.cc
@@ -334,8 +334,8 @@
 
   // TODO(jialiul): When PasswordProtectionService does more than reporting UMA,
   // we need to add finch trial to gate its functionality.
-  password_protection_service_ =
-      base::MakeUnique<PasswordProtectionService>(database_manager());
+  password_protection_service_ = base::MakeUnique<PasswordProtectionService>(
+      database_manager(), url_request_context());
 
   // Track the safe browsing preference of existing profiles.
   // The SafeBrowsingService will be started if any existing profile has the
@@ -376,6 +376,8 @@
 
   Stop(true);
 
+  password_protection_service_.reset();
+
   services_delegate_->ShutdownServices();
 
   // Since URLRequestContextGetters are refcounted, can't count on clearing
diff --git a/chrome/browser/shell_integration_win.cc b/chrome/browser/shell_integration_win.cc
index f49f0fd..c7e322c3 100644
--- a/chrome/browser/shell_integration_win.cc
+++ b/chrome/browser/shell_integration_win.cc
@@ -50,14 +50,9 @@
 #include "chrome/install_static/install_util.h"
 #include "chrome/installer/setup/setup_util.h"
 #include "chrome/installer/util/browser_distribution.h"
-#include "chrome/installer/util/create_reg_key_work_item.h"
 #include "chrome/installer/util/install_util.h"
 #include "chrome/installer/util/scoped_user_protocol_entry.h"
-#include "chrome/installer/util/set_reg_value_work_item.h"
 #include "chrome/installer/util/shell_util.h"
-#include "chrome/installer/util/util_constants.h"
-#include "chrome/installer/util/work_item.h"
-#include "chrome/installer/util/work_item_list.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/utility_process_mojo_client.h"
@@ -558,9 +553,7 @@
 }
 
 DefaultWebClientSetPermission GetDefaultWebClientSetPermission() {
-  BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
-  if (distribution->GetDefaultBrowserControlPolicy() !=
-          BrowserDistribution::DEFAULT_BROWSER_FULL_CONTROL)
+  if (!install_static::SupportsSetAsDefaultBrowser())
     return SET_DEFAULT_NOT_ALLOWED;
   if (ShellUtil::CanMakeChromeDefaultUnattended())
     return SET_DEFAULT_UNATTENDED;
diff --git a/chrome/browser/ui/ash/ash_util.cc b/chrome/browser/ui/ash/ash_util.cc
index 451ad3ce..9bce241 100644
--- a/chrome/browser/ui/ash/ash_util.cc
+++ b/chrome/browser/ui/ash/ash_util.cc
@@ -8,9 +8,11 @@
 #include "ash/common/mojo_interface_factory.h"
 #include "ash/public/interfaces/event_properties.mojom.h"
 #include "ash/shell.h"
+#include "base/command_line.h"
 #include "base/macros.h"
 #include "build/build_config.h"
 #include "chrome/browser/ui/ash/ash_init.h"
+#include "chrome/common/chrome_switches.h"
 #include "content/public/common/service_names.mojom.h"
 #include "services/service_manager/public/cpp/interface_registry.h"
 #include "services/service_manager/public/cpp/service.h"
@@ -60,7 +62,17 @@
 }
 
 bool IsRunningInMash() {
-  return service_manager::ServiceManagerIsRemote();
+  return GetConfig() == Config::MASH;
+}
+
+Config GetConfig() {
+  if (!service_manager::ServiceManagerIsRemote())
+    return Config::CLASSIC;
+
+  return base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+             switches::kMusConfig) == switches::kMash
+             ? Config::MASH
+             : Config::MUS;
 }
 
 bool IsAcceleratorDeprecated(const ui::Accelerator& accelerator) {
diff --git a/chrome/browser/ui/ash/ash_util.h b/chrome/browser/ui/ash/ash_util.h
index 6f3748f..d7a98a4a 100644
--- a/chrome/browser/ui/ash/ash_util.h
+++ b/chrome/browser/ui/ash/ash_util.h
@@ -21,6 +21,18 @@
 
 namespace ash_util {
 
+enum class Config {
+  // Classic mode does not use mus.
+  CLASSIC,
+
+  // Aura is backed by mus, but chrome and ash are still in the same process.
+  MUS,
+
+  // Aura is backed by mus and chrome and ash are in separate processes. In this
+  // mode chrome code can only use ash code in ash/public/cpp.
+  MASH,
+};
+
 // Creates an in-process Service instance of which can host common ash
 // interfaces.
 std::unique_ptr<service_manager::Service> CreateEmbeddedAshService(
@@ -30,8 +42,11 @@
 bool ShouldOpenAshOnStartup();
 
 // Returns true if Chrome is running in the mash shell.
+// TODO(sky): convert to GetConfig().
 bool IsRunningInMash();
 
+Config GetConfig();
+
 // Returns true if the given |accelerator| has been deprecated and hence can
 // be consumed by web contents if needed.
 bool IsAcceleratorDeprecated(const ui::Accelerator& accelerator);
diff --git a/chrome/browser/ui/ash/multi_user/user_switch_util.cc b/chrome/browser/ui/ash/multi_user/user_switch_util.cc
index e00dbdcfa..693d012 100644
--- a/chrome/browser/ui/ash/multi_user/user_switch_util.cc
+++ b/chrome/browser/ui/ash/multi_user/user_switch_util.cc
@@ -7,7 +7,6 @@
 #include "ash/common/system/chromeos/screen_security/screen_tray_item.h"
 #include "ash/common/system/tray/system_tray.h"
 #include "ash/common/wm/overview/window_selector_controller.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "chrome/browser/ui/simple_message_box.h"
@@ -22,7 +21,7 @@
 
   // Cancel overview mode when switching user profiles.
   ash::WindowSelectorController* controller =
-      ash::WmShell::Get()->window_selector_controller();
+      ash::Shell::Get()->window_selector_controller();
   if (controller->IsSelecting())
     controller->ToggleOverview();
 
diff --git a/chrome/browser/ui/ash/multi_user/user_switch_util_unittest.cc b/chrome/browser/ui/ash/multi_user/user_switch_util_unittest.cc
index 6182167c..f5905c5 100644
--- a/chrome/browser/ui/ash/multi_user/user_switch_util_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/user_switch_util_unittest.cc
@@ -2,14 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/ui/ash/multi_user/user_switch_util.h"
+
 #include "ash/common/system/chromeos/screen_security/screen_tray_item.h"
 #include "ash/common/system/tray/system_tray.h"
 #include "ash/common/wm/overview/window_selector_controller.h"
-#include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/ui/ash/multi_user/user_switch_util.h"
 #include "chrome/browser/ui/simple_message_box.h"
 #include "ui/aura/window.h"
 
@@ -82,19 +83,11 @@
   void SwitchCallback() { switch_callback_hit_count_++; }
 
   // Methods needed to test with overview mode.
-  const WindowSelectorController* window_selector_controller() const {
-    return WmShell::Get()->window_selector_controller();
-  }
-  WindowSelectorController* window_selector_controller() {
-    return const_cast<WindowSelectorController*>(
-        const_cast<const TrySwitchingUserTest*>(this)
-            ->window_selector_controller());
-  }
   bool ToggleOverview() {
-    return window_selector_controller()->ToggleOverview();
+    return Shell::Get()->window_selector_controller()->ToggleOverview();
   }
   bool IsSelecting() const {
-    return window_selector_controller()->IsSelecting();
+    return Shell::Get()->window_selector_controller()->IsSelecting();
   }
 
   // Various counter accessors.
diff --git a/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc b/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc
index 787ef3d..6696e6a 100644
--- a/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc
+++ b/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc
@@ -22,7 +22,6 @@
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/system/tray_accessibility.h"
 #include "ash/common/system/user/user_observer.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/chromeos/rotation/tray_rotation_lock.h"
 #include "base/callback.h"
@@ -466,7 +465,7 @@
 }
 
 ash::SystemTrayNotifier* SystemTrayDelegateChromeOS::GetSystemTrayNotifier() {
-  return ash::WmShell::Get()->system_tray_notifier();
+  return ash::Shell::Get()->system_tray_notifier();
 }
 
 void SystemTrayDelegateChromeOS::SetProfile(Profile* profile) {
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index 8d6f45fe..125126d 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -187,12 +187,8 @@
   }
 #endif
 
-  if (window()->IsFullscreen()) {
-    // In fullscreen, all commands except for IDC_FULLSCREEN and IDC_EXIT should
-    // be delivered to the web page. See, intent to implement,
-    // https://goo.gl/4tJ32G.
-    return command_id == IDC_EXIT || command_id == IDC_FULLSCREEN;
-  }
+  if (window()->IsFullscreen() && command_id == IDC_FULLSCREEN)
+    return true;
 
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
   // If this key was registered by the user as a content editing hotkey, then
diff --git a/chrome/browser/ui/browser_command_controller_unittest.cc b/chrome/browser/ui/browser_command_controller_unittest.cc
index e80cf538..8fa33d20 100644
--- a/chrome/browser/ui/browser_command_controller_unittest.cc
+++ b/chrome/browser/ui/browser_command_controller_unittest.cc
@@ -361,27 +361,25 @@
   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_APP_MENU));
   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
 
-  // In fullscreen, only the exit fullscreen commands are reserved. All other
-  // shortcuts should be delivered to the web page. See https://goo.gl/4tJ32G.
-  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
+  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
       IDC_CLOSE_TAB,
       content::NativeWebKeyboardEvent(blink::WebInputEvent::TypeFirst, 0, 0)));
-  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
+  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
       IDC_CLOSE_WINDOW,
       content::NativeWebKeyboardEvent(blink::WebInputEvent::TypeFirst, 0, 0)));
-  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
+  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
       IDC_NEW_INCOGNITO_WINDOW,
       content::NativeWebKeyboardEvent(blink::WebInputEvent::TypeFirst, 0, 0)));
-  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
+  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
       IDC_NEW_TAB,
       content::NativeWebKeyboardEvent(blink::WebInputEvent::TypeFirst, 0, 0)));
-  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
+  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
       IDC_NEW_WINDOW,
       content::NativeWebKeyboardEvent(blink::WebInputEvent::TypeFirst, 0, 0)));
-  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
+  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
       IDC_SELECT_NEXT_TAB,
       content::NativeWebKeyboardEvent(blink::WebInputEvent::TypeFirst, 0, 0)));
-  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
+  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
       IDC_SELECT_PREVIOUS_TAB,
       content::NativeWebKeyboardEvent(blink::WebInputEvent::TypeFirst, 0, 0)));
   EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
diff --git a/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc b/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
index 15d735d4..3bbf552d 100644
--- a/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
+++ b/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
@@ -16,8 +16,11 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/ppapi/ppapi_test.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_utils.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
@@ -401,3 +404,33 @@
   PressEscape();
   EXPECT_TRUE(ObserveTabIsInFullscreen(false));
 }
+
+// Tests that a fullscreen flash plugin can lock the mouse, and that it'll be
+// unlocked when the plugin exits fullscreen.
+IN_PROC_BROWSER_TEST_F(FlashFullscreenInteractiveBrowserTest,
+                       Fullscreen_LockMouse) {
+  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
+  StartFakingTabCapture();
+  ASSERT_TRUE(LaunchFlashFullscreen());
+  content::WebContents* web_contents = GetActiveWebContents();
+  EXPECT_TRUE(ObserveFlashHasFocus(web_contents, true));
+
+  // Try to lock the mouse.
+  content::RenderWidgetHostView* fullscreen_view =
+      web_contents->GetFullscreenRenderWidgetHostView();
+  content::RenderWidgetHost* fullscreen_widget =
+      fullscreen_view->GetRenderWidgetHost();
+  content::RenderProcessHost* process = fullscreen_widget->GetProcess();
+  content::PwnMessageHelper::LockMouse(
+      process, fullscreen_widget->GetRoutingID(), true, false, true);
+
+  // Make sure that the fullscreen widget got the mouse lock.
+  EXPECT_TRUE(fullscreen_view->IsMouseLocked());
+  EXPECT_EQ(fullscreen_widget, content::GetMouseLockWidget(web_contents));
+
+  PressEscape();
+  EXPECT_TRUE(ObserveTabIsInFullscreen(false));
+
+  // Mouse should be unlocked.
+  EXPECT_EQ(nullptr, content::GetMouseLockWidget(web_contents));
+}
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
index eaf8ccc..311970d8 100644
--- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
+++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
@@ -93,22 +93,29 @@
 
 GURL TabContentsSyncedTabDelegate::GetFaviconURLAtIndex(int i) const {
   NavigationEntry* entry = GetPossiblyPendingEntryAtIndex(web_contents_, i);
-  return (entry->GetFavicon().valid ? entry->GetFavicon().url : GURL());
+  return entry ? (entry->GetFavicon().valid ? entry->GetFavicon().url : GURL())
+               : GURL();
 }
 
 ui::PageTransition TabContentsSyncedTabDelegate::GetTransitionAtIndex(
     int i) const {
   NavigationEntry* entry = GetPossiblyPendingEntryAtIndex(web_contents_, i);
-  return entry->GetTransitionType();
+  // If we don't have an entry, there's not a coherent PageTransition we can
+  // supply. There's no PageTransition::Unknown, so we just use the default,
+  // which is PageTransition::LINK.
+  return entry ? entry->GetTransitionType()
+               : ui::PageTransition::PAGE_TRANSITION_LINK;
 }
 
 void TabContentsSyncedTabDelegate::GetSerializedNavigationAtIndex(
     int i,
     sessions::SerializedNavigationEntry* serialized_entry) const {
   NavigationEntry* entry = GetPossiblyPendingEntryAtIndex(web_contents_, i);
-  *serialized_entry =
-      sessions::ContentSerializedNavigationBuilder::FromNavigationEntry(i,
-                                                                        *entry);
+  if (entry) {
+    *serialized_entry =
+        sessions::ContentSerializedNavigationBuilder::FromNavigationEntry(
+            i, *entry);
+  }
 }
 
 bool TabContentsSyncedTabDelegate::ProfileIsSupervised() const {
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
index 968166c2..1ca549b 100644
--- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
+++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
@@ -52,7 +52,9 @@
 
 PaymentRequestBrowserTestBase::PaymentRequestBrowserTestBase(
     const std::string& test_file_path)
-    : test_file_path_(test_file_path), delegate_(nullptr) {}
+    : test_file_path_(test_file_path),
+      delegate_(nullptr),
+      incognito_for_testing_(false) {}
 PaymentRequestBrowserTestBase::~PaymentRequestBrowserTestBase() {}
 
 void PaymentRequestBrowserTestBase::SetUpCommandLine(
@@ -85,6 +87,10 @@
                  base::Unretained(this), web_contents));
 }
 
+void PaymentRequestBrowserTestBase::SetIncognitoForTesting() {
+  incognito_for_testing_ = true;
+}
+
 void PaymentRequestBrowserTestBase::OnDialogOpened() {
   if (event_observer_)
     event_observer_->Observe(DialogEvent::DIALOG_OPENED);
@@ -261,7 +267,8 @@
   DCHECK(web_contents);
   std::unique_ptr<TestChromePaymentRequestDelegate> delegate =
       base::MakeUnique<TestChromePaymentRequestDelegate>(
-          web_contents, this /* observer */, this /* widget_observer */);
+          web_contents, this /* observer */, this /* widget_observer */,
+          incognito_for_testing_);
   delegate_ = delegate.get();
   PaymentRequestWebContentsManager::GetOrCreateForWebContents(web_contents)
       ->CreatePaymentRequest(web_contents, std::move(delegate),
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
index ad8dfea..18ff965 100644
--- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
+++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
@@ -69,6 +69,8 @@
   void SetUpCommandLine(base::CommandLine* command_line) override;
   void SetUpOnMainThread() override;
 
+  void SetIncognitoForTesting();
+
   // PaymentRequestDialogView::ObserverForTest
   void OnDialogOpened() override;
   void OnOrderSummaryOpened() override;
@@ -207,6 +209,7 @@
   std::unique_ptr<net::EmbeddedTestServer> https_server_;
   // Weak, owned by the PaymentRequest object.
   TestChromePaymentRequestDelegate* delegate_;
+  bool incognito_for_testing_;
 
   DISALLOW_COPY_AND_ASSIGN(PaymentRequestBrowserTestBase);
 };
diff --git a/chrome/browser/ui/views/payments/payment_request_can_make_payment_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_can_make_payment_browsertest.cc
index 31836bf..ca68e55 100644
--- a/chrome/browser/ui/views/payments/payment_request_can_make_payment_browsertest.cc
+++ b/chrome/browser/ui/views/payments/payment_request_can_make_payment_browsertest.cc
@@ -39,6 +39,20 @@
   ExpectBodyContains(std::vector<base::string16>{base::ASCIIToUTF16("true")});
 }
 
+// Visa is required, and user has a visa instrument, and user is in incognito
+// mode.
+IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
+                       CanMakePayment_Supported_Incognito) {
+  SetIncognitoForTesting();
+
+  const autofill::CreditCard card = autofill::test::GetCreditCard();  // Visa.
+  AddCreditCard(card);
+
+  CallCanMakePayment();
+
+  ExpectBodyContains(std::vector<base::string16>{base::ASCIIToUTF16("true")});
+}
+
 // Visa is required, and user doesn't have a visa instrument.
 IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
                        CanMakePayment_NotSupported) {
@@ -50,4 +64,20 @@
   ExpectBodyContains(std::vector<base::string16>{base::ASCIIToUTF16("false")});
 }
 
+// Visa is required, and user doesn't have a visa instrument and the user is in
+// incognito mode.
+IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
+                       CanMakePayment_NotSupported_Incognito) {
+  SetIncognitoForTesting();
+
+  const autofill::CreditCard card = autofill::test::GetCreditCard2();  // Amex.
+  AddCreditCard(card);
+
+  CallCanMakePayment();
+
+  // Returns true because the user is in incognito mode, even though it should
+  // return false in a normal profile.
+  ExpectBodyContains(std::vector<base::string16>{base::ASCIIToUTF16("true")});
+}
+
 }  // namespace payments
diff --git a/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.cc b/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.cc
index be45b54..3bd1668 100644
--- a/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.cc
+++ b/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.cc
@@ -15,10 +15,12 @@
 TestChromePaymentRequestDelegate::TestChromePaymentRequestDelegate(
     content::WebContents* web_contents,
     PaymentRequestDialogView::ObserverForTest* observer,
-    views::WidgetObserver* widget_observer)
+    views::WidgetObserver* widget_observer,
+    bool is_incognito)
     : ChromePaymentRequestDelegate(web_contents),
       observer_(observer),
-      widget_observer_(widget_observer) {}
+      widget_observer_(widget_observer),
+      is_incognito_for_testing_(is_incognito) {}
 
 void TestChromePaymentRequestDelegate::ShowDialog(PaymentRequest* request) {
   PaymentRequestDialogView* dialog_view =
@@ -32,4 +34,8 @@
   dialog_ = std::move(dialog_view);
 }
 
+bool TestChromePaymentRequestDelegate::IsIncognito() const {
+  return is_incognito_for_testing_;
+}
+
 }  // namespace payments
diff --git a/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.h b/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.h
index e336e7b..09e6393 100644
--- a/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.h
+++ b/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.h
@@ -27,9 +27,11 @@
   TestChromePaymentRequestDelegate(
       content::WebContents* web_contents,
       PaymentRequestDialogView::ObserverForTest* observer,
-      views::WidgetObserver* widget_observer);
+      views::WidgetObserver* widget_observer,
+      bool is_incognito);
 
   void ShowDialog(PaymentRequest* request) override;
+  bool IsIncognito() const override;
 
   PaymentRequestDialogView* dialog_view() {
     return static_cast<PaymentRequestDialogView*>(dialog_);
@@ -38,6 +40,7 @@
  private:
   PaymentRequestDialogView::ObserverForTest* observer_;
   views::WidgetObserver* widget_observer_;
+  bool is_incognito_for_testing_;
 
   DISALLOW_COPY_AND_ASSIGN(TestChromePaymentRequestDelegate);
 };
diff --git a/chrome/browser/ui/views/uninstall_view.cc b/chrome/browser/ui/views/uninstall_view.cc
index 79e94b5c1..712eae18 100644
--- a/chrome/browser/ui/views/uninstall_view.cc
+++ b/chrome/browser/ui/views/uninstall_view.cc
@@ -77,13 +77,11 @@
   // changed, widgets are not shown. We assume here that if Chrome cannot
   // be set programatically as default, neither can any other browser (for
   // instance because the OS doesn't permit that).
-  BrowserDistribution* dist = BrowserDistribution::GetDistribution();
-  if (dist->GetDefaultBrowserControlPolicy() !=
-          BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED &&
-      ShellUtil::CanMakeChromeDefaultUnattended() &&
+  if (ShellUtil::CanMakeChromeDefaultUnattended() &&
       shell_integration::GetDefaultBrowser() == shell_integration::IS_DEFAULT) {
     browsers_.reset(new BrowsersMap());
-    ShellUtil::GetRegisteredBrowsers(dist, browsers_.get());
+    ShellUtil::GetRegisteredBrowsers(BrowserDistribution::GetDistribution(),
+                                     browsers_.get());
     if (!browsers_->empty()) {
       layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
 
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc
index 338f41d..76d209f 100644
--- a/chrome/browser/ui/webui/extensions/extensions_ui.cc
+++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -181,6 +181,9 @@
       l10n_util::GetStringFUTF16(
           IDS_EXTENSIONS_ADDED_WITHOUT_KNOWLEDGE,
           l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE)));
+  source->AddLocalizedString(
+      "loadErrorCouldNotLoadManifest",
+      IDS_MD_EXTENSIONS_LOAD_ERROR_COULD_NOT_LOAD_MANIFEST);
   source->AddLocalizedString("loadErrorHeading",
                              IDS_MD_EXTENSIONS_LOAD_ERROR_HEADING);
   source->AddLocalizedString("loadErrorFileLabel",
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index 3d4f0a5..654871d5 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -97,6 +97,7 @@
     {"settings", IDS_SETTINGS_SETTINGS},
     {"toggleOn", IDS_SETTINGS_TOGGLE_ON},
     {"toggleOff", IDS_SETTINGS_TOGGLE_OFF},
+    {"notValid", IDS_SETTINGS_NOT_VALID},
   };
   AddLocalizedStringsBulk(html_source, localized_strings,
                           arraysize(localized_strings));
@@ -1558,7 +1559,6 @@
        IDS_SETTINGS_SEARCH_ENGINES_ADD_SEARCH_ENGINE},
       {"searchEnginesEditSearchEngine",
        IDS_SETTINGS_SEARCH_ENGINES_EDIT_SEARCH_ENGINE},
-      {"searchEnginesNotValid", IDS_SETTINGS_SEARCH_ENGINES_NOT_VALID},
       {"searchEngines", IDS_SETTINGS_SEARCH_ENGINES},
       {"searchEnginesDefault", IDS_SETTINGS_SEARCH_ENGINES_DEFAULT_ENGINES},
       {"searchEnginesOther", IDS_SETTINGS_SEARCH_ENGINES_OTHER_ENGINES},
diff --git a/chrome/browser/upgrade_detector_impl.cc b/chrome/browser/upgrade_detector_impl.cc
index 063ac0b..f9ec43d 100644
--- a/chrome/browser/upgrade_detector_impl.cc
+++ b/chrome/browser/upgrade_detector_impl.cc
@@ -34,7 +34,6 @@
 #include "base/win/win_util.h"
 #include "chrome/installer/util/browser_distribution.h"
 #include "chrome/installer/util/google_update_settings.h"
-#include "chrome/installer/util/helper.h"
 #include "chrome/installer/util/install_util.h"
 #elif defined(OS_MACOSX)
 #include "chrome/browser/mac/keystone_glue.h"
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 237f46e2..dff9250 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -1118,6 +1118,15 @@
 #if BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES)
 // Used to enable Mus+ash.
 const char kMash[]                          = "mash";
+
+// Used to enable mus as a separate process, but chrome+ash still together.
+const char kMus[] = "mus";
+
+// This is added to child processes launched from mash or mus. The value of
+// this switch is either kMus or kMash. For example, if chrome is run with
+// '--mash' then the child process representing ash is launched with the
+// switch '--mus-config=mash'.
+const char kMusConfig[] = "mus-config";
 #endif
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) && !defined(OFFICIAL_BUILD)
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index cb471d1..b243b2f 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -338,6 +338,8 @@
 
 #if BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES)
 extern const char kMash[];
+extern const char kMus[];
+extern const char kMusConfig[];
 #endif
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) && !defined(OFFICIAL_BUILD)
diff --git a/chrome/common/extensions/api/accessibility_private.json b/chrome/common/extensions/api/accessibility_private.json
index 0b874da..f5b53a8c 100644
--- a/chrome/common/extensions/api/accessibility_private.json
+++ b/chrome/common/extensions/api/accessibility_private.json
@@ -82,6 +82,18 @@
             "description": "True if key events should be swallowed natively and not propagated if preventDefault() gets called by the extension's background page."
           }
         ]
+      },
+      {
+        "name": "darkenScreen",
+        "type": "function",
+        "description": "Darkens or undarkens the screen.",
+        "parameters": [
+          {
+            "type": "boolean",
+            "name": "enabled",
+            "description": "True to darken screen; false to undarken screen."
+          }
+        ]
       }
     ],
     "events": [
diff --git a/chrome/install_static/chromium_install_modes.cc b/chrome/install_static/chromium_install_modes.cc
index e33f4a5..2377da6 100644
--- a/chrome/install_static/chromium_install_modes.cc
+++ b/chrome/install_static/chromium_install_modes.cc
@@ -41,6 +41,7 @@
         L"",  // Empty default channel name since no update integration.
         ChannelStrategy::UNSUPPORTED,
         true,  // Supports system-level installs.
+        true,  // Supports in-product set as default browser UX.
         true,  // Supported multi-install.
         icon_resources::kApplicationIndex,
         IDR_MAINFRAME,
diff --git a/chrome/install_static/google_chrome_install_modes.cc b/chrome/install_static/google_chrome_install_modes.cc
index 1bf5a33..f0e4bdd 100644
--- a/chrome/install_static/google_chrome_install_modes.cc
+++ b/chrome/install_static/google_chrome_install_modes.cc
@@ -41,6 +41,7 @@
         L"",  // The empty string means "stable".
         ChannelStrategy::ADDITIONAL_PARAMETERS,
         true,  // Supports system-level installs.
+        true,  // Supports in-product set as default browser UX.
         true,  // Supported multi-install.
         icon_resources::kApplicationIndex,
         IDR_MAINFRAME,
@@ -61,6 +62,7 @@
         L"canary",
         ChannelStrategy::FIXED,
         false,  // Does not support system-level installs.
+        false,  // Does not support in-product set as default browser UX.
         false,  // Did not support multi-install.
         icon_resources::kSxSApplicationIndex,
         IDR_SXS,
diff --git a/chrome/install_static/install_constants.h b/chrome/install_static/install_constants.h
index 2d3da55d..dcb1cdff 100644
--- a/chrome/install_static/install_constants.h
+++ b/chrome/install_static/install_constants.h
@@ -96,6 +96,11 @@
   // True if this mode supports system-level installs.
   bool supports_system_level;
 
+  // True if this mode supports in-product mechanisms to make the browser the
+  // user's chosen default browser. Features such as the "Make default" button
+  // in chrome://settings are hidden when this is false.
+  bool supports_set_as_default_browser;
+
   // True if this mode supported the now-deprecated multi-install.
   bool supported_multi_install;
 
diff --git a/chrome/install_static/install_util.cc b/chrome/install_static/install_util.cc
index 45c98913..d47f3e5 100644
--- a/chrome/install_static/install_util.cc
+++ b/chrome/install_static/install_util.cc
@@ -316,6 +316,15 @@
   return result;
 }
 
+std::wstring GetUninstallRegistryPath() {
+  std::wstring result(
+      L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
+  if (*kCompanyPathName)
+    result.append(kCompanyPathName).append(1, L' ');
+  result.append(kProductPathName, kProductPathNameLength);
+  return result.append(InstallDetails::Get().mode().install_suffix);
+}
+
 const wchar_t* GetAppGuid() {
   return InstallDetails::Get().app_guid();
 }
@@ -342,6 +351,10 @@
   return InstallDetails::Get().mode().legacy_command_execute_clsid;
 }
 
+bool SupportsSetAsDefaultBrowser() {
+  return InstallDetails::Get().mode().supports_set_as_default_browser;
+}
+
 int GetIconResourceIndex() {
   return InstallDetails::Get().mode().app_icon_resource_index;
 }
diff --git a/chrome/install_static/install_util.h b/chrome/install_static/install_util.h
index 3b4ae09..7067d5dc2 100644
--- a/chrome/install_static/install_util.h
+++ b/chrome/install_static/install_util.h
@@ -66,6 +66,13 @@
 // their browsing data.
 std::wstring GetRegistryPath();
 
+// Returns the path
+// "Software\Microsoft\Windows\CurrentVersion\Uninstall\[kCompanyPathName ]
+// kProductPathName[install_suffix]. This is the key used for the browser's
+// "Programs and Features" control panel entry for non-MSI installs (the entry
+// for MSI installs is created and owned by Windows Installer).
+std::wstring GetUninstallRegistryPath();
+
 // Returns the app GUID with which Chrome is registered with Google Update, or
 // an empty string if this brand does not integrate with Google Update. This is
 // a simple convenience wrapper around InstallDetails.
@@ -100,6 +107,10 @@
 // install mode never included a DelegateExecute verb handler.
 std::wstring GetLegacyCommandExecuteImplClsid();
 
+// Returns true if this mode supports in-product mechanisms to make the browser
+// the user's chosen default browser.
+bool SupportsSetAsDefaultBrowser();
+
 // Returns the index of the icon resource in the main executable for the mode.
 int GetIconResourceIndex();
 
diff --git a/chrome/install_static/install_util_unittest.cc b/chrome/install_static/install_util_unittest.cc
index 324786a..1ebd91a 100644
--- a/chrome/install_static/install_util_unittest.cc
+++ b/chrome/install_static/install_util_unittest.cc
@@ -383,6 +383,28 @@
               StrCaseEq(kRegistryPaths[std::get<0>(GetParam())]));
 }
 
+TEST_P(InstallStaticUtilTest, GetUninstallRegistryPath) {
+#if defined(GOOGLE_CHROME_BUILD)
+  // The uninstall registry path strings for the brand's install modes; parallel
+  // to kInstallModes.
+  static constexpr const wchar_t* kUninstallRegistryPaths[] = {
+      L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Google Chrome",
+      L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"  // (cont'd)
+      L"Google Chrome SxS",
+  };
+#else
+  // The registry path strings for the brand's install modes; parallel to
+  // kInstallModes.
+  static constexpr const wchar_t* kUninstallRegistryPaths[] = {
+      L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Chromium",
+  };
+#endif
+  static_assert(arraysize(kUninstallRegistryPaths) == NUM_INSTALL_MODES,
+                "kUninstallRegistryPaths out of date.");
+  EXPECT_THAT(GetUninstallRegistryPath(),
+              StrCaseEq(kUninstallRegistryPaths[std::get<0>(GetParam())]));
+}
+
 TEST_P(InstallStaticUtilTest, GetAppGuid) {
   // For brands that do not integrate with Omaha/Google Update, the app guid is
   // an empty string.
diff --git a/chrome/installer/linux/debian/expected_deps_ia32_jessie b/chrome/installer/linux/debian/expected_deps_ia32_jessie
index 600a2ea..8b472b1 100644
--- a/chrome/installer/linux/debian/expected_deps_ia32_jessie
+++ b/chrome/installer/linux/debian/expected_deps_ia32_jessie
@@ -1,23 +1,24 @@
 gconf-service
 libasound2 (>= 1.0.16)
 libatk1.0-0 (>= 1.12.4)
-libc6 (>= 2.11)
+libc6 (>= 2.3.6-6~)
+libc6 (>= 2.9)
 libcairo2 (>= 1.2.4)
 libcups2 (>= 1.4.0)
 libdbus-1-3 (>= 1.2.14)
 libexpat1 (>= 2.0.1)
-libfontconfig1 (>= 2.9.0)
-libfreetype6 (>= 2.3.9)
+libfontconfig1 (>= 2.11)
+libfreetype6 (>= 2.4.2)
 libgcc1 (>= 1:4.1.1)
-libgconf-2-4 (>= 2.31.1)
+libgconf-2-4 (>= 3.2.5)
 libgdk-pixbuf2.0-0 (>= 2.22.0)
-libglib2.0-0 (>= 2.26.0)
+libglib2.0-0 (>= 2.31.8)
 libgtk2.0-0 (>= 2.24.0)
-libnspr4 (>= 2:4.9-2~) | libnspr4-0d (>= 1.8.0.10)
-libnss3 (>= 2:3.13.4-2~) | libnss3-1d (>= 3.12.4)
+libnspr4 (>= 2:4.9-2~)
+libnss3 (>= 2:3.13.4-2~)
 libpango-1.0-0 (>= 1.14.0)
 libpangocairo-1.0-0 (>= 1.14.0)
-libstdc++6 (>= 4.6)
+libstdc++6 (>= 4.8.1)
 libx11-6 (>= 2:1.4.99.1)
 libx11-xcb1
 libxcb1 (>= 1.6)
diff --git a/chrome/installer/linux/rpm/expected_deps_i386 b/chrome/installer/linux/rpm/expected_deps_i386
index 308cd60..1d5f54d 100644
--- a/chrome/installer/linux/rpm/expected_deps_i386
+++ b/chrome/installer/linux/rpm/expected_deps_i386
@@ -1,4 +1,5 @@
 ld-linux.so.2
+ld-linux.so.2(GLIBC_2.0)
 ld-linux.so.2(GLIBC_2.1)
 libX11-xcb.so.1
 libX11.so.6
@@ -18,7 +19,6 @@
 libc.so.6(GLIBC_2.0)
 libc.so.6(GLIBC_2.1)
 libc.so.6(GLIBC_2.1.3)
-libc.so.6(GLIBC_2.11)
 libc.so.6(GLIBC_2.2)
 libc.so.6(GLIBC_2.2.3)
 libc.so.6(GLIBC_2.3)
@@ -27,6 +27,7 @@
 libc.so.6(GLIBC_2.4)
 libc.so.6(GLIBC_2.6)
 libc.so.6(GLIBC_2.7)
+libc.so.6(GLIBC_2.9)
 libcairo.so.2
 libcups.so.2
 libdbus-1.so.3
@@ -67,9 +68,10 @@
 libsmime3.so
 libstdc++.so.6
 libstdc++.so.6(GLIBCXX_3.4)
-libstdc++.so.6(GLIBCXX_3.4.10)
 libstdc++.so.6(GLIBCXX_3.4.11)
 libstdc++.so.6(GLIBCXX_3.4.14)
 libstdc++.so.6(GLIBCXX_3.4.15)
+libstdc++.so.6(GLIBCXX_3.4.18)
+libstdc++.so.6(GLIBCXX_3.4.19)
 libstdc++.so.6(GLIBCXX_3.4.9)
 libxcb.so.1
diff --git a/chrome/installer/linux/rpm/expected_deps_x86_64 b/chrome/installer/linux/rpm/expected_deps_x86_64
index ddaf415..da09bcc 100644
--- a/chrome/installer/linux/rpm/expected_deps_x86_64
+++ b/chrome/installer/linux/rpm/expected_deps_x86_64
@@ -16,6 +16,8 @@
 libatk-1.0.so.0()(64bit)
 libc.so.6()(64bit)
 libc.so.6(GLIBC_2.11)(64bit)
+libc.so.6(GLIBC_2.14)(64bit)
+libc.so.6(GLIBC_2.15)(64bit)
 libc.so.6(GLIBC_2.2.5)(64bit)
 libc.so.6(GLIBC_2.3)(64bit)
 libc.so.6(GLIBC_2.3.2)(64bit)
@@ -59,9 +61,10 @@
 libsmime3.so()(64bit)
 libstdc++.so.6()(64bit)
 libstdc++.so.6(GLIBCXX_3.4)(64bit)
-libstdc++.so.6(GLIBCXX_3.4.10)(64bit)
 libstdc++.so.6(GLIBCXX_3.4.11)(64bit)
 libstdc++.so.6(GLIBCXX_3.4.14)(64bit)
 libstdc++.so.6(GLIBCXX_3.4.15)(64bit)
+libstdc++.so.6(GLIBCXX_3.4.18)(64bit)
+libstdc++.so.6(GLIBCXX_3.4.19)(64bit)
 libstdc++.so.6(GLIBCXX_3.4.9)(64bit)
 libxcb.so.1()(64bit)
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc
index 614d7fe..0eeac1b2 100644
--- a/chrome/installer/setup/install_worker.cc
+++ b/chrome/installer/setup/install_worker.cc
@@ -177,7 +177,10 @@
       << "This must only be called for MSI installations!";
 
   HKEY reg_root = installer_state.root_key();
-  base::string16 uninstall_reg(product.distribution()->GetUninstallRegPath());
+  // Assert that this is only called with the one relevant distribution.
+  // TODO(grt): Remove this when BrowserDistribution goes away.
+  DCHECK_EQ(BrowserDistribution::GetDistribution(), product.distribution());
+  base::string16 uninstall_reg = install_static::GetUninstallRegistryPath();
 
   WorkItem* delete_reg_key = work_item_list->AddDeleteRegKeyWorkItem(
       reg_root, uninstall_reg, KEY_WOW64_32KEY);
@@ -417,7 +420,10 @@
     DCHECK_EQ(quoted_uninstall_cmd.GetCommandLineString()[0], '"');
     quoted_uninstall_cmd.AppendArguments(uninstall_arguments, false);
 
-    base::string16 uninstall_reg = browser_dist->GetUninstallRegPath();
+    // Assert that this is only called with the one relevant distribution.
+    // TODO(grt): Remove this when BrowserDistribution goes away.
+    DCHECK_EQ(BrowserDistribution::GetDistribution(), browser_dist);
+    base::string16 uninstall_reg = install_static::GetUninstallRegistryPath();
     install_list->AddCreateRegKeyWorkItem(
         reg_root, uninstall_reg, KEY_WOW64_32KEY);
     install_list->AddSetRegValueWorkItem(reg_root,
diff --git a/chrome/installer/setup/uninstall.cc b/chrome/installer/setup/uninstall.cc
index 6d14e7c..531a001f 100644
--- a/chrome/installer/setup/uninstall.cc
+++ b/chrome/installer/setup/uninstall.cc
@@ -625,12 +625,6 @@
                                   const base::string16& browser_entry_suffix,
                                   InstallStatus* exit_code) {
   DCHECK(exit_code);
-  if (dist->GetDefaultBrowserControlPolicy() ==
-      BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED) {
-    // We should have never set those keys.
-    return true;
-  }
-
   base::FilePath chrome_exe(installer_state.target_path().Append(kChromeExe));
 
   // Delete Software\Classes\ChromeHTML.
@@ -897,8 +891,11 @@
   base::string16 distribution_data(browser_dist->GetDistributionData(reg_root));
 
   // Remove Control Panel uninstall link.
-  InstallUtil::DeleteRegistryKey(reg_root, browser_dist->GetUninstallRegPath(),
-                                 KEY_WOW64_32KEY);
+  // Assert that this is only called with the one relevant distribution.
+  // TODO(grt): Remove this when BrowserDistribution goes away.
+  DCHECK_EQ(BrowserDistribution::GetDistribution(), browser_dist);
+  InstallUtil::DeleteRegistryKey(
+      reg_root, install_static::GetUninstallRegistryPath(), KEY_WOW64_32KEY);
 
   // Remove Omaha product key.
   InstallUtil::DeleteRegistryKey(
diff --git a/chrome/installer/util/browser_distribution.cc b/chrome/installer/util/browser_distribution.cc
index ad06c2c..d0c1372 100644
--- a/chrome/installer/util/browser_distribution.cc
+++ b/chrome/installer/util/browser_distribution.cc
@@ -147,15 +147,6 @@
   return L"";
 }
 
-base::string16 BrowserDistribution::GetUninstallRegPath() {
-  return L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Chromium";
-}
-
-BrowserDistribution::DefaultBrowserControlPolicy
-    BrowserDistribution::GetDefaultBrowserControlPolicy() {
-  return DEFAULT_BROWSER_FULL_CONTROL;
-}
-
 void BrowserDistribution::UpdateInstallStatus(bool system_install,
     installer::ArchiveType archive_type,
     installer::InstallStatus install_status) {
diff --git a/chrome/installer/util/browser_distribution.h b/chrome/installer/util/browser_distribution.h
index a474f49..aa77a262 100644
--- a/chrome/installer/util/browser_distribution.h
+++ b/chrome/installer/util/browser_distribution.h
@@ -30,12 +30,6 @@
     SUBFOLDER_APPS,
   };
 
-  enum DefaultBrowserControlPolicy {
-    DEFAULT_BROWSER_UNSUPPORTED,
-    DEFAULT_BROWSER_OS_CONTROL_ONLY,
-    DEFAULT_BROWSER_FULL_CONTROL
-  };
-
   virtual ~BrowserDistribution();
 
   static BrowserDistribution* GetDistribution();
@@ -82,12 +76,6 @@
   virtual base::string16 GetDistributionData(HKEY root_key);
 #endif
 
-  virtual base::string16 GetUninstallRegPath();
-
-  // Returns an enum specifying the different ways in which this distribution
-  // is allowed to be set as default.
-  virtual DefaultBrowserControlPolicy GetDefaultBrowserControlPolicy();
-
   virtual void UpdateInstallStatus(bool system_install,
       installer::ArchiveType archive_type,
       installer::InstallStatus install_status);
diff --git a/chrome/installer/util/google_chrome_distribution.cc b/chrome/installer/util/google_chrome_distribution.cc
index 049ad73..d3f4b5c9 100644
--- a/chrome/installer/util/google_chrome_distribution.cc
+++ b/chrome/installer/util/google_chrome_distribution.cc
@@ -224,11 +224,6 @@
   return result;
 }
 
-base::string16 GoogleChromeDistribution::GetUninstallRegPath() {
-  return L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
-         L"Google Chrome";
-}
-
 // This method checks if we need to change "ap" key in Google Update to try
 // full installer as fall back method in case incremental installer fails.
 // - If incremental installer fails we append a magic string ("-full"), if
diff --git a/chrome/installer/util/google_chrome_distribution.h b/chrome/installer/util/google_chrome_distribution.h
index acb60c8..5e3377d7 100644
--- a/chrome/installer/util/google_chrome_distribution.h
+++ b/chrome/installer/util/google_chrome_distribution.h
@@ -50,8 +50,6 @@
   // key returned by GetVersionKey() is deleted.
   base::string16 GetDistributionData(HKEY root_key) override;
 
-  base::string16 GetUninstallRegPath() override;
-
   void UpdateInstallStatus(
       bool system_install,
       installer::ArchiveType archive_type,
diff --git a/chrome/installer/util/google_chrome_distribution_dummy.cc b/chrome/installer/util/google_chrome_distribution_dummy.cc
index 30bf0c1..8ab0766 100644
--- a/chrome/installer/util/google_chrome_distribution_dummy.cc
+++ b/chrome/installer/util/google_chrome_distribution_dummy.cc
@@ -60,10 +60,6 @@
   return base::string16();
 }
 
-base::string16 GoogleChromeDistribution::GetUninstallRegPath() {
-  return base::string16();
-}
-
 void GoogleChromeDistribution::UpdateInstallStatus(bool system_install,
     installer::ArchiveType archive_type,
     installer::InstallStatus install_status) {
diff --git a/chrome/installer/util/google_chrome_sxs_distribution.cc b/chrome/installer/util/google_chrome_sxs_distribution.cc
index 1476856..7cb97f1 100644
--- a/chrome/installer/util/google_chrome_sxs_distribution.cc
+++ b/chrome/installer/util/google_chrome_sxs_distribution.cc
@@ -41,16 +41,6 @@
   }
 }
 
-base::string16 GoogleChromeSxSDistribution::GetUninstallRegPath() {
-  return GoogleChromeDistribution::GetUninstallRegPath().append(
-      installer::kSxSSuffix);
-}
-
-BrowserDistribution::DefaultBrowserControlPolicy
-    GoogleChromeSxSDistribution::GetDefaultBrowserControlPolicy() {
-  return DEFAULT_BROWSER_OS_CONTROL_ONLY;
-}
-
 bool GoogleChromeSxSDistribution::ShouldSetExperimentLabels() {
   return true;
 }
diff --git a/chrome/installer/util/google_chrome_sxs_distribution.h b/chrome/installer/util/google_chrome_sxs_distribution.h
index f4717ec..368c9a5 100644
--- a/chrome/installer/util/google_chrome_sxs_distribution.h
+++ b/chrome/installer/util/google_chrome_sxs_distribution.h
@@ -23,8 +23,6 @@
   base::string16 GetShortcutName() override;
   base::string16 GetStartMenuShortcutSubfolder(
       Subfolder subfolder_type) override;
-  base::string16 GetUninstallRegPath() override;
-  DefaultBrowserControlPolicy GetDefaultBrowserControlPolicy() override;
   bool ShouldSetExperimentLabels() override;
   bool HasUserExperiments() override;
 
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc
index 67a90a1..4138583 100644
--- a/chrome/installer/util/shell_util.cc
+++ b/chrome/installer/util/shell_util.cc
@@ -1789,11 +1789,6 @@
 
 ShellUtil::DefaultState ShellUtil::GetChromeDefaultStateFromPath(
     const base::FilePath& chrome_exe) {
-  BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
-  if (distribution->GetDefaultBrowserControlPolicy() ==
-      BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED) {
-    return NOT_DEFAULT;
-  }
   // When we check for default browser we don't necessarily want to count file
   // type handlers and icons as having changed the default browser status,
   // since the user may have changed their shell settings to cause HTML files
@@ -1806,18 +1801,13 @@
   static const wchar_t* const kChromeProtocols[] = { L"http", L"https" };
   DefaultState default_state = ProbeProtocolHandlers(
       chrome_exe, kChromeProtocols, arraysize(kChromeProtocols));
-  UpdateDefaultBrowserBeaconWithState(distribution, default_state);
+  UpdateDefaultBrowserBeaconWithState(BrowserDistribution::GetDistribution(),
+                                      default_state);
   return default_state;
 }
 
 ShellUtil::DefaultState ShellUtil::GetChromeDefaultProtocolClientState(
     const base::string16& protocol) {
-  BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
-  if (distribution->GetDefaultBrowserControlPolicy() ==
-      BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED) {
-    return NOT_DEFAULT;
-  }
-
   if (protocol.empty())
     return UNKNOWN_DEFAULT;
 
@@ -1854,11 +1844,11 @@
                                   bool elevate_if_not_admin) {
   DCHECK(!(shell_change & SYSTEM_LEVEL) || IsUserAnAdmin());
 
-  BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
-  if (distribution->GetDefaultBrowserControlPolicy() !=
-      BrowserDistribution::DEFAULT_BROWSER_FULL_CONTROL) {
+  // Assert that this is only called with the one relevant distribution.
+  // TODO(grt): Remove this when BrowserDistribution goes away.
+  DCHECK_EQ(BrowserDistribution::GetDistribution(), dist);
+  if (!install_static::SupportsSetAsDefaultBrowser())
     return false;
-  }
 
   // Windows 8 does not permit making a browser default just like that.
   // This process needs to be routed through the system's UI. Use
@@ -1922,10 +1912,12 @@
     BrowserDistribution* dist,
     const base::FilePath& chrome_exe) {
   DCHECK(!CanMakeChromeDefaultUnattended());
-  if (dist->GetDefaultBrowserControlPolicy() !=
-      BrowserDistribution::DEFAULT_BROWSER_FULL_CONTROL) {
+
+  // Assert that this is only called with the one relevant distribution.
+  // TODO(grt): Remove this when BrowserDistribution goes away.
+  DCHECK_EQ(BrowserDistribution::GetDistribution(), dist);
+  if (!install_static::SupportsSetAsDefaultBrowser())
     return false;
-  }
 
   if (!RegisterChromeBrowser(dist, chrome_exe, base::string16(), true))
       return false;
@@ -1964,10 +1956,11 @@
     BrowserDistribution* dist,
     const base::FilePath& chrome_exe,
     const base::string16& protocol) {
-  if (dist->GetDefaultBrowserControlPolicy() !=
-      BrowserDistribution::DEFAULT_BROWSER_FULL_CONTROL) {
+  // Assert that this is only called with the one relevant distribution.
+  // TODO(grt): Remove this when BrowserDistribution goes away.
+  DCHECK_EQ(BrowserDistribution::GetDistribution(), dist);
+  if (!install_static::SupportsSetAsDefaultBrowser())
     return false;
-  }
 
   if (!RegisterChromeForProtocol(
            dist, chrome_exe, base::string16(), protocol, true))
@@ -2014,10 +2007,12 @@
     const base::FilePath& chrome_exe,
     const base::string16& protocol) {
   DCHECK(!CanMakeChromeDefaultUnattended());
-  if (dist->GetDefaultBrowserControlPolicy() !=
-      BrowserDistribution::DEFAULT_BROWSER_FULL_CONTROL) {
+
+  // Assert that this is only called with the one relevant distribution.
+  // TODO(grt): Remove this when BrowserDistribution goes away.
+  DCHECK_EQ(BrowserDistribution::GetDistribution(), dist);
+  if (!install_static::SupportsSetAsDefaultBrowser())
     return false;
-  }
 
   if (!RegisterChromeForProtocol(
            dist, chrome_exe, base::string16(), protocol, true))
@@ -2058,11 +2053,6 @@
                                       const base::string16& unique_suffix,
                                       bool elevate_if_not_admin) {
   DCHECK_EQ(BrowserDistribution::GetDistribution(), dist);
-  if (dist->GetDefaultBrowserControlPolicy() ==
-      BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED) {
-    return false;
-  }
-
   base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess();
 
   base::string16 suffix;
@@ -2148,11 +2138,6 @@
                                           const base::string16& unique_suffix,
                                           const base::string16& protocol,
                                           bool elevate_if_not_admin) {
-  if (dist->GetDefaultBrowserControlPolicy() ==
-      BrowserDistribution::DEFAULT_BROWSER_UNSUPPORTED) {
-    return false;
-  }
-
   base::string16 suffix;
   if (!unique_suffix.empty()) {
     suffix = unique_suffix;
diff --git a/chrome/installer/util/util_constants.cc b/chrome/installer/util/util_constants.cc
index 27b6743..bd60716a 100644
--- a/chrome/installer/util/util_constants.cc
+++ b/chrome/installer/util/util_constants.cc
@@ -208,7 +208,6 @@
 const wchar_t kLnkExt[] = L".lnk";
 const wchar_t kNaClExe[] = L"nacl64.exe";
 const wchar_t kSetupExe[] = L"setup.exe";
-const wchar_t kSxSSuffix[] = L" SxS";
 const wchar_t kUninstallStringField[] = L"UninstallString";
 const wchar_t kUninstallArgumentsField[] = L"UninstallArguments";
 const wchar_t kUninstallDisplayNameField[] = L"DisplayName";
diff --git a/chrome/installer/util/util_constants.h b/chrome/installer/util/util_constants.h
index 644c7b33..64746c6 100644
--- a/chrome/installer/util/util_constants.h
+++ b/chrome/installer/util/util_constants.h
@@ -211,7 +211,6 @@
 extern const wchar_t kLnkExt[];
 extern const wchar_t kNaClExe[];
 extern const wchar_t kSetupExe[];
-extern const wchar_t kSxSSuffix[];
 extern const wchar_t kUninstallArgumentsField[];
 extern const wchar_t kUninstallDisplayNameField[];
 extern const wchar_t kUninstallInstallationDate[];
diff --git a/chrome/renderer/autofill/OWNERS b/chrome/renderer/autofill/OWNERS
index e1ff0df..4afcbe9 100644
--- a/chrome/renderer/autofill/OWNERS
+++ b/chrome/renderer/autofill/OWNERS
@@ -4,6 +4,4 @@
 sebsg@chromium.org
 vabr@chromium.org
 
-per-file password*=gcasto@chromium.org
-
 # COMPONENT: UI>Browser>Autofill
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 84362ab..8d6c727 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3063,6 +3063,7 @@
       "../browser/resources/chromeos/braille_ime/braille_ime.js",
       "../browser/resources/chromeos/select_to_speak/select_to_speak.js",
       "../browser/resources/chromeos/select_to_speak/test_support.js",
+      "../browser/resources/chromeos/switch_access/prefs.js",
       "../browser/resources/chromeos/switch_access/switch_access.js",
       "../browser/resources/chromeos/switch_access/test_support.js",
       "../browser/resources/chromeos/switch_access/testable_switch_access.js",
@@ -3262,6 +3263,7 @@
     "../browser/notifications/stub_notification_center_mac.mm",
     "../browser/ntp_snippets/bookmark_last_visit_updater_unittest.cc",
     "../browser/ntp_snippets/download_suggestions_provider_unittest.cc",
+    "../browser/page_load_metrics/experiments/delay_navigation_throttle_unittest.cc",
     "../browser/page_load_metrics/metrics_web_contents_observer_unittest.cc",
     "../browser/page_load_metrics/observers/aborts_page_load_metrics_observer_unittest.cc",
     "../browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc",
@@ -5203,7 +5205,7 @@
     testonly = true
     embedded_services = [ ":mash_browser_tests_manifest" ]
     standalone_services = [ "//services/tracing:manifest" ]
-    catalog_deps = [ "//chrome/app:catalog_for_mash" ]
+    catalog_deps = [ "//chrome/app:catalog_for_mus" ]
   }
 
   copy("mash_browser_tests_catalog_copy") {
diff --git a/chrome/test/base/mojo_test_connector.cc b/chrome/test/base/mojo_test_connector.cc
index da87cda..72a35d68e 100644
--- a/chrome/test/base/mojo_test_connector.cc
+++ b/chrome/test/base/mojo_test_connector.cc
@@ -14,6 +14,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread.h"
+#include "chrome/common/chrome_switches.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/service_names.mojom.h"
 #include "content/public/test/test_launcher.h"
@@ -51,6 +52,7 @@
             base::TestLauncher::LaunchOptions* test_launch_options) {
     command_line->AppendSwitch(MojoTestConnector::kTestSwitch);
     command_line->AppendSwitch(switches::kChildProcess);
+    command_line->AppendSwitchASCII(switches::kMusConfig, switches::kMash);
 
     platform_channel_ = base::MakeUnique<mojo::edk::PlatformChannelPair>();
 
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker.cc b/chrome/test/chromedriver/chrome/navigation_tracker.cc
index 635ce8b..0fdceb63 100644
--- a/chrome/test/chromedriver/chrome/navigation_tracker.cc
+++ b/chrome/test/chromedriver/chrome/navigation_tracker.cc
@@ -21,8 +21,13 @@
     "_generated_background_page.html";
 
 Status MakeNavigationCheckFailedStatus(Status command_status) {
-  return Status(command_status.code() == kTimeout ? kTimeout : kUnknownError,
-                "cannot determine loading status", command_status);
+  if (command_status.code() == kUnexpectedAlertOpen)
+    return Status(kUnexpectedAlertOpen);
+  else if (command_status.code() == kTimeout)
+    return Status(kTimeout);
+  else
+    return Status(kUnknownError, "cannot determine loading status",
+                  command_status);
 }
 
 }  // namespace
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index 1a39f53..96aee9d 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -435,6 +435,9 @@
       return status;
   }
 
+  status = session->chrome->ActivateWebView(web_view_id);
+  if (status.IsError())
+    return status;
   session->window = web_view_id;
   session->SwitchToTopFrame();
   session->mouse_position = WebPoint(0, 0);
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 88019e90..6d97e18 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -671,6 +671,14 @@
     self.assertEquals(self.GetHttpUrlForFile('/chromedriver/link_nav.html'),
                       self._driver.GetCurrentUrl())
 
+  def testAlertHandlingOnPageUnload(self):
+    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/empty.html'))
+    self._driver.ExecuteScript('window.onbeforeunload=function(){return true}')
+    self._driver.GoBack()
+    self.assertTrue(self._driver.IsAlertOpen())
+    self._driver.HandleAlert(True)
+    self.assertFalse(self._driver.IsAlertOpen())
+
   def testRefresh(self):
     self._driver.Load(self.GetHttpUrlForFile('/chromedriver/empty.html'))
     self._driver.Refresh()
diff --git a/chrome/test/data/extensions/xhr.txt b/chrome/test/data/extensions/xhr.txt
new file mode 100644
index 0000000..83e5b38
--- /dev/null
+++ b/chrome/test/data/extensions/xhr.txt
@@ -0,0 +1 @@
+File to request via XHR.
diff --git a/chrome/test/data/extensions/xhr.txt.mock-http-headers b/chrome/test/data/extensions/xhr.txt.mock-http-headers
new file mode 100644
index 0000000..b22728a
--- /dev/null
+++ b/chrome/test/data/extensions/xhr.txt.mock-http-headers
@@ -0,0 +1,3 @@
+HTTP/1.1 200 OK
+Content-Type: text/plain; charset=utf-8
+Access-Control-Allow-Origin: *
diff --git a/chrome/test/data/extensions/xhr_from_content_script/content_script.js b/chrome/test/data/extensions/xhr_from_content_script/content_script.js
new file mode 100644
index 0000000..be84682
--- /dev/null
+++ b/chrome/test/data/extensions/xhr_from_content_script/content_script.js
@@ -0,0 +1,21 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Add a button to the page that can fetch a cross-origin file.
+var b = document.createElement('button');
+b.id = 'xhrButton';
+b.innerText = 'Send XHR';
+document.body.appendChild(b);
+
+// Do a cross-origin fetch to an origin not listed in this extension's manifest.
+// The HTTP request will have an Origin: HTTP header with a chrome-extension://
+// security origin. Notifies the test if it succeeds or fails.
+b.onclick = () =>
+    fetch('http://maps.google.com:' + location.port + '/extensions/xhr.txt')
+        .then((result) => result.text())
+        .then((text) => {
+          window.domAutomationController.send(
+              text == 'File to request via XHR.\n');
+        })
+        .catch(err => window.domAutomationController.send(false));
diff --git a/chrome/test/data/extensions/xhr_from_content_script/manifest.json b/chrome/test/data/extensions/xhr_from_content_script/manifest.json
new file mode 100644
index 0000000..c968697
--- /dev/null
+++ b/chrome/test/data/extensions/xhr_from_content_script/manifest.json
@@ -0,0 +1,12 @@
+{
+  "name": "XHR from content script",
+  "description": "An extension that sends XHRs from a content script.",
+  "version": "0.1",
+  "manifest_version": 2,
+  "content_scripts": [
+    {
+      "matches": ["http://127.0.0.1/title1.html"],
+      "js": ["content_script.js"]
+    }
+  ]
+}
diff --git a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
index 208d344a..a7a3ab73 100644
--- a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
+++ b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
@@ -202,6 +202,12 @@
   mocha.grep(assert(extension_load_error_tests.TestNames.Interaction)).run();
 });
 
+TEST_F('CrExtensionsBrowserTest', 'ExtensionLoadErrorCodeSectionTest',
+       function() {
+  extension_load_error_tests.registerTests();
+  mocha.grep(assert(extension_load_error_tests.TestNames.CodeSection)).run();
+});
+
 ////////////////////////////////////////////////////////////////////////////////
 // Extension Service Tests
 
diff --git a/chrome/test/data/webui/extensions/extension_code_section_test.js b/chrome/test/data/webui/extensions/extension_code_section_test.js
index db95544..79b28e2 100644
--- a/chrome/test/data/webui/extensions/extension_code_section_test.js
+++ b/chrome/test/data/webui/extensions/extension_code_section_test.js
@@ -22,7 +22,7 @@
       /** @type {extensions.CodeSection} */
       var codeSection;
 
-      var noCodeError = 'No code here';
+      var couldNotDisplayCode = 'No code here';
 
       suiteSetup(function() {
         return PolymerTest.importHtml('chrome://extensions/code_section.html');
@@ -32,7 +32,7 @@
       setup(function() {
         PolymerTest.clearBody();
         codeSection = new extensions.CodeSection();
-        codeSection.noCodeError = noCodeError;
+        codeSection.couldNotDisplayCode = couldNotDisplayCode;
         document.body.appendChild(codeSection);
       });
 
@@ -42,7 +42,7 @@
         var testIsVisible =
             extension_test_util.isVisible.bind(null, codeSection);
         expectFalse(!!codeSection.code);
-        expectTrue(codeSection.isMainHidden_());
+        expectTrue(codeSection.isEmpty());
         expectTrue(codeSection.$$('#main').hidden);
         expectFalse(testIsVisible('#main'));
         expectTrue(testIsVisible('#no-code'));
diff --git a/chrome/test/data/webui/extensions/extension_load_error_test.js b/chrome/test/data/webui/extensions/extension_load_error_test.js
index 3707617d..45a052b0 100644
--- a/chrome/test/data/webui/extensions/extension_load_error_test.js
+++ b/chrome/test/data/webui/extensions/extension_load_error_test.js
@@ -7,6 +7,7 @@
   /** @enum {string} */
   var TestNames = {
     Interaction: 'Interaction',
+    CodeSection: 'Code Section',
   };
 
   /**
@@ -58,6 +59,22 @@
         MockInteractions.tap(loadError.$$('#dismiss'));
         expectFalse(isDialogVisible());
       });
+
+      test(assert(TestNames.CodeSection), function() {
+        expectTrue(loadError.$.code.isEmpty());
+        var loadErrorProperties = {
+          error: 'Some error',
+          path: '/some/path',
+          source: {
+            beforeHighlight: 'before',
+            highlight: 'highlight',
+            afterHighlight: 'after',
+          },
+        };
+
+        loadError.set('loadError', loadErrorProperties);
+        expectFalse(loadError.$.code.isEmpty());
+      });
     });
   }
 
diff --git a/chrome/test/data/webui/settings/appearance_page_test.js b/chrome/test/data/webui/settings/appearance_page_test.js
index 92c08a5..3beb0a74 100644
--- a/chrome/test/data/webui/settings/appearance_page_test.js
+++ b/chrome/test/data/webui/settings/appearance_page_test.js
@@ -15,6 +15,7 @@
     'openWallpaperManager',
     'useDefaultTheme',
     'useSystemTheme',
+    'validateStartupPage',
   ]);
 
   /** @private */
@@ -22,6 +23,9 @@
 
   /** @private */
   this.isSupervised_ = false;
+
+  /** @private */
+  this.isHomeUrlValid_ = true;
 };
 
 TestAppearanceBrowserProxy.prototype = {
@@ -69,6 +73,19 @@
   setIsSupervised: function(isSupervised) {
     this.isSupervised_ = isSupervised;
   },
+
+  /** @override */
+  validateStartupPage: function(value) {
+    this.methodCalled('validateStartupPage');
+    return Promise.resolve(this.isHomeUrlValid_);
+  },
+
+  /**
+   * @param {boolean} isValid
+   */
+   setValidStartupPageResponse: function(isValid) {
+     this.isHomeUrlValid_ = isValid;
+   }
 };
 
 var appearancePage = null;
@@ -224,4 +241,43 @@
       assertEquals('175%', getDefaultZoomText());
     });
   });
+
+  test('show home button toggling', function() {
+    assertFalse(!!appearancePage.$$('.list-frame'));
+    appearancePage.set('prefs', {browser: {show_home_button: {value: true}}});
+
+    Polymer.dom.flush();
+
+    assertTrue(!!appearancePage.$$('.list-frame'));
+  });
+
+  test('home button urls', function() {
+    appearancePage.set('prefs', {
+      browser: {show_home_button: {value: true}},
+      homepage: {type: chrome.settingsPrivate.PrefType.URL, value: 'test'}
+    });
+
+    Polymer.dom.flush();
+
+    var input = appearancePage.$$('#customHomePage');
+    assertTrue(!!input);
+    assertFalse(input.invalid);
+    assertEquals(input.value, 'test');
+
+    input.value = '@@@';
+    appearanceBrowserProxy.setValidStartupPageResponse(false);
+    input.fire('input');
+
+    return appearanceBrowserProxy.whenCalled('validateStartupPage')
+        .then(function() {
+          Polymer.dom.flush();
+          assertEquals(input.value, '@@@');
+          assertTrue(input.invalid);
+
+          // Should reset to default value on change event.
+          input.$$('paper-input').fire('change');
+          Polymer.dom.flush();
+          assertEquals(input.value, 'test');
+        });
+  });
 });
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn
index 36aad7e..2210484 100644
--- a/chrome/utility/BUILD.gn
+++ b/chrome/utility/BUILD.gn
@@ -51,8 +51,6 @@
     "//media",
     "//net:net_with_v8",
     "//printing/features",
-    "//services/image_decoder:lib",
-    "//services/image_decoder/public/cpp",
     "//services/service_manager/public/cpp",
     "//skia",
     "//sql",
@@ -96,6 +94,7 @@
       "//chrome/common:mojo_bindings",
       "//chrome/common/importer:interfaces",
       "//net:net_utility_services",
+      "//services/data_decoder:lib",
     ]
   }
 
diff --git a/chrome/utility/DEPS b/chrome/utility/DEPS
index 3021b8c..b75a35d 100644
--- a/chrome/utility/DEPS
+++ b/chrome/utility/DEPS
@@ -10,7 +10,6 @@
   "+extensions/common",
   "+extensions/features",
   "+media",
-  "+services/image_decoder",
   "+services/service_manager/public/cpp",
   "+skia/ext",
   "+third_party/libxml",
diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc
index 0b8a8d23..c8fee49 100644
--- a/chrome/utility/chrome_content_utility_client.cc
+++ b/chrome/utility/chrome_content_utility_client.cc
@@ -16,7 +16,6 @@
 #include "chrome/common/file_patcher.mojom.h"
 #include "chrome/utility/utility_message_handler.h"
 #include "components/safe_json/utility/safe_json_parser_mojo_impl.h"
-#include "content/public/child/image_decoder_utils.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/service_info.h"
 #include "content/public/utility/utility_thread.h"
@@ -25,8 +24,6 @@
 #include "extensions/features/features.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "printing/features/features.h"
-#include "services/image_decoder/image_decoder_service.h"
-#include "services/image_decoder/public/interfaces/constants.mojom.h"
 #include "services/service_manager/public/cpp/interface_registry.h"
 #include "third_party/zlib/google/zip.h"
 
@@ -220,11 +217,6 @@
 }
 #endif  // !defined(OS_ANDROID)
 
-std::unique_ptr<service_manager::Service> CreateImageDecoderService() {
-  content::UtilityThread::Get()->EnsureBlinkInitialized();
-  return image_decoder::ImageDecoderService::Create();
-}
-
 }  // namespace
 
 ChromeContentUtilityClient::ChromeContentUtilityClient()
@@ -303,13 +295,6 @@
 #endif
 }
 
-void ChromeContentUtilityClient::RegisterServices(StaticServiceMap* services) {
-  content::ServiceInfo image_decoder_info;
-  image_decoder_info.factory = base::Bind(&CreateImageDecoderService);
-  services->insert(
-      std::make_pair(image_decoder::mojom::kServiceName, image_decoder_info));
-}
-
 // static
 void ChromeContentUtilityClient::PreSandboxStartup() {
 #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/utility/chrome_content_utility_client.h b/chrome/utility/chrome_content_utility_client.h
index 01993c5f..379d498 100644
--- a/chrome/utility/chrome_content_utility_client.h
+++ b/chrome/utility/chrome_content_utility_client.h
@@ -21,7 +21,6 @@
   bool OnMessageReceived(const IPC::Message& message) override;
   void ExposeInterfacesToBrowser(
       service_manager::InterfaceRegistry* registry) override;
-  void RegisterServices(StaticServiceMap* services) override;
 
   static void PreSandboxStartup();
 
diff --git a/chromecast/media/cma/backend/alsa/BUILD.gn b/chromecast/media/cma/backend/alsa/BUILD.gn
index 2838a6d3..3552bc4c6 100644
--- a/chromecast/media/cma/backend/alsa/BUILD.gn
+++ b/chromecast/media/cma/backend/alsa/BUILD.gn
@@ -110,14 +110,14 @@
   ]
 }
 
-alsa_controls_volume = !enable_assistant
+alsa_owns_volume = !enable_assistant
 
 buildflag_header("alsa_features") {
   header = "alsa_features.h"
 
   flags = [
     "ALSA_MONOTONIC_RAW_TSTAMPS=$use_alsa_monotonic_raw_tstamps",
-    "ALSA_CONTROLS_VOLUME=$alsa_controls_volume",
+    "ALSA_OWNS_VOLUME=$alsa_owns_volume",
   ]
 }
 
diff --git a/chromecast/media/cma/backend/alsa/volume_control.cc b/chromecast/media/cma/backend/alsa/volume_control.cc
index bb47b355..872b4f43 100644
--- a/chromecast/media/cma/backend/alsa/volume_control.cc
+++ b/chromecast/media/cma/backend/alsa/volume_control.cc
@@ -133,8 +133,9 @@
   void SetVolume(AudioContentType type, float level) {
     level = std::max(0.0f, std::min(level, 1.0f));
     thread_.task_runner()->PostTask(
-        FROM_HERE, base::Bind(&VolumeControlInternal::SetVolumeOnThread,
-                              base::Unretained(this), type, level));
+        FROM_HERE,
+        base::Bind(&VolumeControlInternal::SetVolumeOnThread,
+                   base::Unretained(this), type, level, false /* from_alsa */));
   }
 
   bool IsMuted(AudioContentType type) {
@@ -144,12 +145,13 @@
 
   void SetMuted(AudioContentType type, bool muted) {
     thread_.task_runner()->PostTask(
-        FROM_HERE, base::Bind(&VolumeControlInternal::SetMutedOnThread,
-                              base::Unretained(this), type, muted));
+        FROM_HERE,
+        base::Bind(&VolumeControlInternal::SetMutedOnThread,
+                   base::Unretained(this), type, muted, false /* from_alsa */));
   }
 
   void SetOutputLimit(AudioContentType type, float limit) {
-    if (BUILDFLAG(ALSA_CONTROLS_VOLUME)) {
+    if (BUILDFLAG(ALSA_OWNS_VOLUME)) {
       return;
     }
     limit = std::max(0.0f, std::min(limit, 1.0f));
@@ -167,9 +169,9 @@
                       AudioContentType::kCommunication}) {
       CHECK(stored_values_.GetDouble(ContentTypeToDbFSKey(type), &dbfs));
       volumes_[type] = VolumeControl::DbFSToVolume(dbfs);
-      if (BUILDFLAG(ALSA_CONTROLS_VOLUME)) {
-        // If ALSA controls volume, our internal mixer should not apply any
-        // scaling multiplier.
+      if (BUILDFLAG(ALSA_OWNS_VOLUME)) {
+        // If ALSA owns volume, our internal mixer should not apply any scaling
+        // multiplier.
         StreamMixerAlsa::Get()->SetVolume(type, 1.0f);
       } else {
         StreamMixerAlsa::Get()->SetVolume(type, DbFsToScale(dbfs));
@@ -179,9 +181,9 @@
       muted_[type] = false;
     }
 
-    if (BUILDFLAG(ALSA_CONTROLS_VOLUME)) {
-      // If ALSA controls the volume, then read the current volume and mute
-      // state from the ALSA mixer element(s).
+    if (BUILDFLAG(ALSA_OWNS_VOLUME)) {
+      // If ALSA owns the volume, then read the current volume and mute state
+      // from the ALSA mixer element(s).
       volumes_[AudioContentType::kMedia] = alsa_volume_control_->GetVolume();
       muted_[AudioContentType::kMedia] = alsa_volume_control_->IsMuted();
     } else {
@@ -194,10 +196,15 @@
     initialize_complete_event_.Signal();
   }
 
-  void SetVolumeOnThread(AudioContentType type, float level) {
+  void SetVolumeOnThread(AudioContentType type, float level, bool from_alsa) {
     DCHECK(thread_.task_runner()->BelongsToCurrentThread());
+    DCHECK(!from_alsa || type == AudioContentType::kMedia);
     {
       base::AutoLock lock(volume_lock_);
+      if (from_alsa && alsa_volume_control_->VolumeThroughAlsa(
+                           volumes_[AudioContentType::kMedia]) == level) {
+        return;
+      }
       if (level == volumes_[type]) {
         return;
       }
@@ -205,11 +212,11 @@
     }
 
     float dbfs = VolumeControl::VolumeToDbFS(level);
-    if (!BUILDFLAG(ALSA_CONTROLS_VOLUME)) {
+    if (!BUILDFLAG(ALSA_OWNS_VOLUME)) {
       StreamMixerAlsa::Get()->SetVolume(type, DbFsToScale(dbfs));
     }
 
-    if (type == AudioContentType::kMedia) {
+    if (!from_alsa && type == AudioContentType::kMedia) {
       alsa_volume_control_->SetVolume(level);
     }
 
@@ -224,7 +231,7 @@
     SerializeJsonToFile(storage_path_, stored_values_);
   }
 
-  void SetMutedOnThread(AudioContentType type, bool muted) {
+  void SetMutedOnThread(AudioContentType type, bool muted, bool from_alsa) {
     DCHECK(thread_.task_runner()->BelongsToCurrentThread());
     {
       base::AutoLock lock(volume_lock_);
@@ -234,11 +241,11 @@
       muted_[type] = muted;
     }
 
-    if (!BUILDFLAG(ALSA_CONTROLS_VOLUME)) {
+    if (!BUILDFLAG(ALSA_OWNS_VOLUME)) {
       StreamMixerAlsa::Get()->SetMuted(type, muted);
     }
 
-    if (type == AudioContentType::kMedia) {
+    if (!from_alsa && type == AudioContentType::kMedia) {
       alsa_volume_control_->SetMuted(muted);
     }
 
@@ -253,46 +260,9 @@
   // AlsaVolumeControl::Delegate implementation:
   void OnAlsaVolumeOrMuteChange(float new_volume, bool new_mute) override {
     DCHECK(thread_.task_runner()->BelongsToCurrentThread());
-    bool volume_changed = false;
-    bool mute_changed = false;
-    {
-      base::AutoLock lock(volume_lock_);
-      if (alsa_volume_control_->VolumeThroughAlsa(
-              volumes_[AudioContentType::kMedia]) != new_volume) {
-        volume_changed = true;
-        volumes_[AudioContentType::kMedia] = new_volume;
-      }
-
-      if (muted_[AudioContentType::kMedia] != new_mute) {
-        mute_changed = true;
-        muted_[AudioContentType::kMedia] = new_mute;
-      }
-    }
-
-    if (!volume_changed && !mute_changed) {
-      return;
-    }
-
-    {
-      base::AutoLock lock(observer_lock_);
-      if (volume_changed) {
-        for (VolumeObserver* observer : volume_observers_) {
-          observer->OnVolumeChange(AudioContentType::kMedia, new_volume);
-        }
-      }
-      if (mute_changed) {
-        for (VolumeObserver* observer : volume_observers_) {
-          observer->OnMuteChange(AudioContentType::kMedia, new_mute);
-        }
-      }
-    }
-
-    if (volume_changed) {
-      float dbfs = VolumeControl::VolumeToDbFS(new_volume);
-      stored_values_.SetDouble(ContentTypeToDbFSKey(AudioContentType::kMedia),
-                               dbfs);
-      SerializeJsonToFile(storage_path_, stored_values_);
-    }
+    SetVolumeOnThread(AudioContentType::kMedia, new_volume,
+                      true /* from_alsa */);
+    SetMutedOnThread(AudioContentType::kMedia, new_mute, true /* from_alsa */);
   }
 
   base::FilePath storage_path_;
diff --git a/components/autofill/OWNERS b/components/autofill/OWNERS
index 585db25e..4afcbe9 100644
--- a/components/autofill/OWNERS
+++ b/components/autofill/OWNERS
@@ -4,9 +4,4 @@
 sebsg@chromium.org
 vabr@chromium.org
 
-# Owners for password autofill/generation only.
-# TODO(gcasto): Change to per-file ownership after http://crbug.com/235756
-# is fixed.
-gcasto@chromium.org
-
 # COMPONENT: UI>Browser>Autofill
diff --git a/components/exo/wm_helper_ash.cc b/components/exo/wm_helper_ash.cc
index e402b560..1a025097 100644
--- a/components/exo/wm_helper_ash.cc
+++ b/components/exo/wm_helper_ash.cc
@@ -7,7 +7,6 @@
 #include "ash/common/accessibility_delegate.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
-#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "base/memory/singleton.h"
 #include "ui/aura/client/focus_client.h"
@@ -28,7 +27,7 @@
       aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow());
   focus_client->AddObserver(this);
   ui::DeviceDataManager::GetInstance()->AddObserver(this);
-  ash::WmShell::Get()->system_tray_notifier()->AddAccessibilityObserver(this);
+  ash::Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(this);
 }
 
 WMHelperAsh::~WMHelperAsh() {
@@ -41,8 +40,7 @@
   ash::Shell::GetInstance()->activation_client()->RemoveObserver(this);
   ash::Shell::GetInstance()->RemoveShellObserver(this);
   ui::DeviceDataManager::GetInstance()->RemoveObserver(this);
-  ash::WmShell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(
-      this);
+  ash::Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(this);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/components/metrics/proto/translate_event.proto b/components/metrics/proto/translate_event.proto
index 94ae6ec..ad19742 100644
--- a/components/metrics/proto/translate_event.proto
+++ b/components/metrics/proto/translate_event.proto
@@ -131,6 +131,9 @@
     WEB_CONTENTS_NOT_ACTIVE = 22;
     // The translate UI was not shown because the user is editing a form field.
     EDITABLE_FIELD_IS_ACTIVE = 23;
+    // The translate UI was not shown because the language is in the user's User
+    // Language Profile.
+    LANGUAGE_IN_ULP = 24;
   }
 
   // Event received from translate UI.
diff --git a/components/nacl/browser/nacl_browser_delegate.h b/components/nacl/browser/nacl_browser_delegate.h
index 45c93b5..9d73cf0 100644
--- a/components/nacl/browser/nacl_browser_delegate.h
+++ b/components/nacl/browser/nacl_browser_delegate.h
@@ -73,10 +73,6 @@
   // Returns whether NaCl application with this manifest URL should be debugged.
   virtual bool URLMatchesDebugPatterns(const GURL& manifest_url) = 0;
 
-  // Returns a callback that handles NaCl idle state transitions.
-  virtual content::BrowserPpapiHost::OnKeepaliveCallback
-      GetOnKeepaliveCallback() = 0;
-
   // Returns whether Non-SFI mode is allowed for a given manifest URL.
   virtual bool IsNonSfiModeAllowed(const base::FilePath& profile_directory,
                                    const GURL& manifest_url) = 0;
diff --git a/components/nacl/browser/nacl_process_host.cc b/components/nacl/browser/nacl_process_host.cc
index d92d9cc..01c55c5 100644
--- a/components/nacl/browser/nacl_process_host.cc
+++ b/components/nacl/browser/nacl_process_host.cc
@@ -197,9 +197,6 @@
 
 }  // namespace
 
-unsigned NaClProcessHost::keepalive_throttle_interval_milliseconds_ =
-    ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds;
-
 NaClProcessHost::NaClProcessHost(
     const GURL& manifest_url,
     base::File nexe_file,
@@ -344,12 +341,6 @@
 }
 #endif  // defined(OS_POSIX) && !defined(OS_MACOSX)
 
-// static
-void NaClProcessHost::SetPpapiKeepAliveThrottleForTesting(
-    unsigned milliseconds) {
-  keepalive_throttle_interval_milliseconds_ = milliseconds;
-}
-
 void NaClProcessHost::Launch(
     NaClHostMessageFilter* nacl_host_message_filter,
     IPC::Message* reply_msg,
@@ -930,14 +921,10 @@
       nacl_host_message_filter_->render_process_id(),
       render_view_id_,
       profile_directory_));
-  ppapi_host_->SetOnKeepaliveCallback(
-      NaClBrowser::GetDelegate()->GetOnKeepaliveCallback());
 
   ppapi::PpapiNaClPluginArgs args;
   args.off_the_record = nacl_host_message_filter_->off_the_record();
   args.permissions = permissions_;
-  args.keepalive_throttle_interval_milliseconds =
-      keepalive_throttle_interval_milliseconds_;
   base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
   DCHECK(cmdline);
   std::string flag_whitelist[] = {
diff --git a/components/nacl/browser/test_nacl_browser_delegate.cc b/components/nacl/browser/test_nacl_browser_delegate.cc
index dfa61d2..81e925c1 100644
--- a/components/nacl/browser/test_nacl_browser_delegate.cc
+++ b/components/nacl/browser/test_nacl_browser_delegate.cc
@@ -57,11 +57,6 @@
   return false;
 }
 
-content::BrowserPpapiHost::OnKeepaliveCallback
-TestNaClBrowserDelegate::GetOnKeepaliveCallback() {
-  return content::BrowserPpapiHost::OnKeepaliveCallback();
-}
-
 bool TestNaClBrowserDelegate::IsNonSfiModeAllowed(
     const base::FilePath& profile_directory,
     const GURL& manifest_url) {
diff --git a/components/nacl/browser/test_nacl_browser_delegate.h b/components/nacl/browser/test_nacl_browser_delegate.h
index 5803340..69dde4e 100644
--- a/components/nacl/browser/test_nacl_browser_delegate.h
+++ b/components/nacl/browser/test_nacl_browser_delegate.h
@@ -38,8 +38,6 @@
                              base::FilePath* file_path) override;
   void SetDebugPatterns(const std::string& debug_patterns) override;
   bool URLMatchesDebugPatterns(const GURL& manifest_url) override;
-  content::BrowserPpapiHost::OnKeepaliveCallback GetOnKeepaliveCallback()
-      override;
   bool IsNonSfiModeAllowed(const base::FilePath& profile_directory,
                            const GURL& manifest_url) override;
 
diff --git a/components/ntp_snippets/bookmarks/bookmark_last_visit_utils_unittest.cc b/components/ntp_snippets/bookmarks/bookmark_last_visit_utils_unittest.cc
index 6f06527..cacb077 100644
--- a/components/ntp_snippets/bookmarks/bookmark_last_visit_utils_unittest.cc
+++ b/components/ntp_snippets/bookmarks/bookmark_last_visit_utils_unittest.cc
@@ -161,7 +161,7 @@
 namespace {
 
 base::Callback<bool(const GURL& url)> DeleteAllFilter() {
-  return base::Bind([] (const GURL& url) { return true; });
+  return base::Bind([](const GURL& url) { return true; });
 }
 
 base::Callback<bool(const GURL& url)> DeleteOneURLFilter(
diff --git a/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.cc b/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.cc
index 36ea19a3..436e8bc 100644
--- a/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.cc
+++ b/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.cc
@@ -230,11 +230,11 @@
 }
 
 void BookmarkSuggestionsProvider::BookmarkNodeRemoved(
-      bookmarks::BookmarkModel* model,
-      const bookmarks::BookmarkNode* parent,
-      int old_index,
-      const bookmarks::BookmarkNode* node,
-      const std::set<GURL>& no_longer_bookmarked) {
+    bookmarks::BookmarkModel* model,
+    const bookmarks::BookmarkNode* parent,
+    int old_index,
+    const bookmarks::BookmarkNode* node,
+    const std::set<GURL>& no_longer_bookmarked) {
   base::Time time;
   if (GetLastVisitDateForNTPBookmark(
           *node, consider_bookmark_visits_from_desktop_, &time) &&
diff --git a/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.h b/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.h
index 19d30bbe2..64cd6e2 100644
--- a/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.h
+++ b/components/ntp_snippets/bookmarks/bookmark_suggestions_provider.h
@@ -68,12 +68,11 @@
   void BookmarkNodeAdded(bookmarks::BookmarkModel* model,
                          const bookmarks::BookmarkNode* parent,
                          int index) override;
-  void BookmarkNodeRemoved(
-      bookmarks::BookmarkModel* model,
-      const bookmarks::BookmarkNode* parent,
-      int old_index,
-      const bookmarks::BookmarkNode* node,
-      const std::set<GURL>& no_longer_bookmarked) override;
+  void BookmarkNodeRemoved(bookmarks::BookmarkModel* model,
+                           const bookmarks::BookmarkNode* parent,
+                           int old_index,
+                           const bookmarks::BookmarkNode* node,
+                           const std::set<GURL>& no_longer_bookmarked) override;
   void BookmarkNodeChanged(bookmarks::BookmarkModel* model,
                            const bookmarks::BookmarkNode* node) override {}
   void BookmarkNodeFaviconChanged(
diff --git a/components/ntp_snippets/bookmarks/bookmark_suggestions_provider_unittest.cc b/components/ntp_snippets/bookmarks/bookmark_suggestions_provider_unittest.cc
index 4c0cda9..92682d5 100644
--- a/components/ntp_snippets/bookmarks/bookmark_suggestions_provider_unittest.cc
+++ b/components/ntp_snippets/bookmarks/bookmark_suggestions_provider_unittest.cc
@@ -38,9 +38,10 @@
  public:
   BookmarkSuggestionsProviderTest()
       : model_(bookmarks::TestBookmarkClient::CreateModel()) {
-    EXPECT_CALL(observer_, OnNewSuggestions(_, Category::FromKnownCategory(
-                                                   KnownCategories::BOOKMARKS),
-                                            IsEmpty()))
+    EXPECT_CALL(observer_,
+                OnNewSuggestions(
+                    _, Category::FromKnownCategory(KnownCategories::BOOKMARKS),
+                    IsEmpty()))
         .RetiresOnSaturation();
     EXPECT_CALL(observer_,
                 OnCategoryStatusChanged(
@@ -64,8 +65,7 @@
   std::unique_ptr<BookmarkSuggestionsProvider> provider_;
 };
 
-TEST_F(BookmarkSuggestionsProviderTest,
-       ShouldProvideBookmarkSuggestions) {
+TEST_F(BookmarkSuggestionsProviderTest, ShouldProvideBookmarkSuggestions) {
   GURL url("http://my-new-bookmarked.url");
   // Note, this update to the model does not trigger OnNewSuggestions() on the
   // observer as the provider realizes no new nodes were added.
@@ -125,12 +125,13 @@
   EXPECT_THAT(IsDismissedFromNTPForBookmark(*dismissed_node), Eq(true));
 
   // Clear history and make sure the suggestions actually get removed.
-  EXPECT_CALL(observer_, OnNewSuggestions(_, Category::FromKnownCategory(
-                                                 KnownCategories::BOOKMARKS),
-                                          IsEmpty()));
+  EXPECT_CALL(observer_,
+              OnNewSuggestions(
+                  _, Category::FromKnownCategory(KnownCategories::BOOKMARKS),
+                  IsEmpty()));
   static_cast<ContentSuggestionsProvider*>(provider_.get())
       ->ClearHistory(base::Time(), base::Time::Max(),
-                     base::Bind([] (const GURL& url) { return true; }));
+                     base::Bind([](const GURL& url) { return true; }));
 
   // Verify the dismissed marker is gone.
   EXPECT_THAT(IsDismissedFromNTPForBookmark(*dismissed_node), Eq(false));
@@ -143,4 +144,3 @@
 
 }  // namespace
 }  // namespace ntp_snippets
-
diff --git a/components/ntp_snippets/category.cc b/components/ntp_snippets/category.cc
index 0a3fc04..1ef1bed 100644
--- a/components/ntp_snippets/category.cc
+++ b/components/ntp_snippets/category.cc
@@ -22,9 +22,10 @@
 
 // static
 Category Category::FromIDValue(int id) {
-  DCHECK(IsValidIDValue(id)) << id << " is not a valid category ID. This may "
-                                      "have been caused by removal of a local "
-                                      "KnownCategory.";
+  DCHECK(IsValidIDValue(id)) << id
+                             << " is not a valid category ID. This may have "
+                                "been caused by removal of a local "
+                                "KnownCategory.";
   return Category(id);
 }
 
diff --git a/components/ntp_snippets/category_rankers/click_based_category_ranker.cc b/components/ntp_snippets/category_rankers/click_based_category_ranker.cc
index 653a68f..4b4cfa9 100644
--- a/components/ntp_snippets/category_rankers/click_based_category_ranker.cc
+++ b/components/ntp_snippets/category_rankers/click_based_category_ranker.cc
@@ -384,8 +384,8 @@
     KnownCategories known_category) {
   Category category = Category::FromKnownCategory(known_category);
   DCHECK(!ContainsCategory(category));
-  ordered_categories_.push_back(RankedCategory(
-      category, /*clicks=*/0, /*last_dismissed=*/base::Time()));
+  ordered_categories_.push_back(
+      RankedCategory(category, /*clicks=*/0, /*last_dismissed=*/base::Time()));
 }
 
 namespace {
diff --git a/components/ntp_snippets/content_suggestions_provider.h b/components/ntp_snippets/content_suggestions_provider.h
index dea83e7..8c485dfd5 100644
--- a/components/ntp_snippets/content_suggestions_provider.h
+++ b/components/ntp_snippets/content_suggestions_provider.h
@@ -151,6 +151,7 @@
   ContentSuggestionsProvider(Observer* observer);
 
   Observer* observer() const { return observer_; }
+
  private:
   Observer* observer_;
 };
diff --git a/components/ntp_snippets/content_suggestions_service.cc b/components/ntp_snippets/content_suggestions_service.cc
index 2815c52..3e274ff 100644
--- a/components/ntp_snippets/content_suggestions_service.cc
+++ b/components/ntp_snippets/content_suggestions_service.cc
@@ -362,11 +362,10 @@
     for (const history::URLRow& row : deleted_rows) {
       deleted_urls.insert(row.url());
     }
-    base::Callback<bool(const GURL& url)> filter = base::Bind(
-        [](const std::set<GURL>& set, const GURL& url) {
-          return set.count(url) != 0;
-        },
-        deleted_urls);
+    base::Callback<bool(const GURL& url)> filter =
+        base::Bind([](const std::set<GURL>& set,
+                      const GURL& url) { return set.count(url) != 0; },
+                   deleted_urls);
     // We usually don't have any time-related information (the URLRow objects
     // usually don't provide a |last_visit()| timestamp. Hence we simply clear
     // the whole history for the selected URLs.
diff --git a/components/ntp_snippets/features.cc b/components/ntp_snippets/features.cc
index d9066dc..89a6f085 100644
--- a/components/ntp_snippets/features.cc
+++ b/components/ntp_snippets/features.cc
@@ -22,14 +22,14 @@
 const base::Feature kRecentOfflineTabSuggestionsFeature{
     "NTPOfflinePageSuggestions", base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kSaveToOfflineFeature{
-    "NTPSaveToOffline", base::FEATURE_ENABLED_BY_DEFAULT};
+const base::Feature kSaveToOfflineFeature{"NTPSaveToOffline",
+                                          base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kOfflineBadgeFeature{
-    "NTPOfflineBadge", base::FEATURE_ENABLED_BY_DEFAULT};
+const base::Feature kOfflineBadgeFeature{"NTPOfflineBadge",
+                                         base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kIncreasedVisibility{
-    "NTPSnippetsIncreasedVisibility", base::FEATURE_ENABLED_BY_DEFAULT};
+const base::Feature kIncreasedVisibility{"NTPSnippetsIncreasedVisibility",
+                                         base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kPhysicalWebPageSuggestionsFeature{
     "NTPPhysicalWebPageSuggestions", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/ntp_snippets/features.h b/components/ntp_snippets/features.h
index c70e278..ff8abca 100644
--- a/components/ntp_snippets/features.h
+++ b/components/ntp_snippets/features.h
@@ -24,7 +24,7 @@
 extern const base::Feature kBookmarkSuggestionsFeature;
 extern const base::Feature kRecentOfflineTabSuggestionsFeature;
 extern const base::Feature kPhysicalWebPageSuggestionsFeature;
-extern const base::Feature kForeignSessionsSuggestionsFeature;;
+extern const base::Feature kForeignSessionsSuggestionsFeature;
 
 // Feature to allow the 'save to offline' option to appear in the snippets
 // context menu.
diff --git a/components/ntp_snippets/ntp_snippets_constants.cc b/components/ntp_snippets/ntp_snippets_constants.cc
index 22bcb6c5..d09040b1 100644
--- a/components/ntp_snippets/ntp_snippets_constants.cc
+++ b/components/ntp_snippets/ntp_snippets_constants.cc
@@ -15,8 +15,10 @@
 const char kContentSuggestionsServer[] =
     "https://chromecontentsuggestions-pa.googleapis.com/v1/suggestions/fetch";
 const char kContentSuggestionsStagingServer[] =
-    "https://staging-chromecontentsuggestions-pa.googleapis.com/v1/suggestions/fetch";
+    "https://staging-chromecontentsuggestions-pa.googleapis.com/v1/suggestions/"
+    "fetch";
 const char kContentSuggestionsAlphaServer[] =
-    "https://alpha-chromecontentsuggestions-pa.sandbox.googleapis.com/v1/suggestions/fetch";
+    "https://alpha-chromecontentsuggestions-pa.sandbox.googleapis.com/v1/"
+    "suggestions/fetch";
 
 }  // namespace ntp_snippets
diff --git a/components/ntp_snippets/offline_pages/recent_tab_suggestions_provider_unittest.cc b/components/ntp_snippets/offline_pages/recent_tab_suggestions_provider_unittest.cc
index 0801f7a..7d8489c 100644
--- a/components/ntp_snippets/offline_pages/recent_tab_suggestions_provider_unittest.cc
+++ b/components/ntp_snippets/offline_pages/recent_tab_suggestions_provider_unittest.cc
@@ -165,14 +165,12 @@
   EXPECT_CALL(*observer(), OnNewSuggestions(_, _, _)).Times(2);
   EXPECT_CALL(
       *observer(),
-      OnNewSuggestions(_, recent_tabs_category(),
-                       UnorderedElementsAre(
-                           Property(&ContentSuggestion::url,
-                                    GURL("http://dummy.com/1")),
-                           Property(&ContentSuggestion::url,
-                                    GURL("http://dummy.com/2")),
-                           Property(&ContentSuggestion::url,
-                                    GURL("http://dummy.com/3")))));
+      OnNewSuggestions(
+          _, recent_tabs_category(),
+          UnorderedElementsAre(
+              Property(&ContentSuggestion::url, GURL("http://dummy.com/1")),
+              Property(&ContentSuggestion::url, GURL("http://dummy.com/2")),
+              Property(&ContentSuggestion::url, GURL("http://dummy.com/3")))));
 
   auto recent_tabs_list = CreateDummyRecentTabs({1, 2, 3});
   for (OfflinePageItem& recent_tab : recent_tabs_list) {
@@ -212,12 +210,10 @@
       *observer(),
       OnNewSuggestions(
           _, recent_tabs_category(),
-          ElementsAre(Property(&ContentSuggestion::url,
-                               GURL("http://dummy.com/3")),
-                      Property(&ContentSuggestion::url,
-                               GURL("http://dummy.com/1")),
-                      Property(&ContentSuggestion::url,
-                               GURL("http://dummy.com/2")))));
+          ElementsAre(
+              Property(&ContentSuggestion::url, GURL("http://dummy.com/3")),
+              Property(&ContentSuggestion::url, GURL("http://dummy.com/1")),
+              Property(&ContentSuggestion::url, GURL("http://dummy.com/2")))));
   AddTabAndOfflinePageToModel(CreateDummyRecentTab(3, tomorrow));
 }
 
@@ -261,10 +257,9 @@
       base::Bind(&CaptureDismissedSuggestions, &dismissed_suggestions));
   EXPECT_THAT(
       dismissed_suggestions,
-      UnorderedElementsAre(Property(&ContentSuggestion::url,
-                                    GURL("http://dummy.com/2")),
-                           Property(&ContentSuggestion::url,
-                                    GURL("http://dummy.com/3"))));
+      UnorderedElementsAre(
+          Property(&ContentSuggestion::url, GURL("http://dummy.com/2")),
+          Property(&ContentSuggestion::url, GURL("http://dummy.com/3"))));
 
   // Clear dismissed suggestions.
   provider()->ClearDismissedSuggestionsForDebugging(recent_tabs_category());
diff --git a/components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider.cc b/components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider.cc
index 5398b22..b8382c0c 100644
--- a/components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider.cc
+++ b/components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider.cc
@@ -50,8 +50,7 @@
   return left.distance_estimate < right.distance_estimate;
 }
 
-void FilterOutByGroupId(
-    physical_web::MetadataList& page_metadata_list) {
+void FilterOutByGroupId(physical_web::MetadataList& page_metadata_list) {
   // |std::unique| only removes duplicates that immediately follow each other.
   // Thus, first, we have to sort by group_id and distance and only then remove
   // duplicates.
@@ -69,18 +68,17 @@
 
   // Each empty group_id must be treated as unique, so we do not apply
   // std::unique to them at all.
-  auto nonempty_group_id_begin = std::find_if(
-      page_metadata_list.begin(), page_metadata_list.end(),
-      [](const physical_web::Metadata& page) {
-        return !page.group_id.empty();
-      });
+  auto nonempty_group_id_begin =
+      std::find_if(page_metadata_list.begin(), page_metadata_list.end(),
+                   [](const physical_web::Metadata& page) {
+                     return !page.group_id.empty();
+                   });
 
-  auto new_end = std::unique(
-      nonempty_group_id_begin, page_metadata_list.end(),
-      [](const physical_web::Metadata& left,
-         const physical_web::Metadata& right) {
-        return left.group_id == right.group_id;
-      });
+  auto new_end = std::unique(nonempty_group_id_begin, page_metadata_list.end(),
+                             [](const physical_web::Metadata& left,
+                                const physical_web::Metadata& right) {
+                               return left.group_id == right.group_id;
+                             });
 
   page_metadata_list.erase(new_end, page_metadata_list.end());
 }
@@ -98,8 +96,8 @@
       physical_web_data_source_(physical_web_data_source),
       pref_service_(pref_service) {
   observer->OnCategoryStatusChanged(this, provided_category_, category_status_);
-  physical_web_data_source_->RegisterListener(this,
-      physical_web::BACKGROUND_INTERMITTENT);
+  physical_web_data_source_->RegisterListener(
+      this, physical_web::BACKGROUND_INTERMITTENT);
   // TODO(vitaliii): Rewrite initial fetch once crbug.com/667754 is resolved.
   FetchPhysicalWebPages();
 }
diff --git a/components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider_unittest.cc b/components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider_unittest.cc
index 696cebb5..588eed8 100644
--- a/components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider_unittest.cc
+++ b/components/ntp_snippets/physical_web_pages/physical_web_page_suggestions_provider_unittest.cc
@@ -360,8 +360,7 @@
   provider()->DismissSuggestion(GetDummySuggestionId(1));
   provider()->DismissSuggestion(GetDummySuggestionId(2));
 
-  physical_web_data_source()->SetMetadataList(
-      CreateDummyPhysicalWebPages({2}));
+  physical_web_data_source()->SetMetadataList(CreateDummyPhysicalWebPages({2}));
   FireUrlLost("https://resolved_url.com/1");
 
   physical_web_data_source()->SetMetadataList(
diff --git a/components/ntp_snippets/pref_names.cc b/components/ntp_snippets/pref_names.cc
index cd03e32..271c8900 100644
--- a/components/ntp_snippets/pref_names.cc
+++ b/components/ntp_snippets/pref_names.cc
@@ -11,8 +11,7 @@
 
 const char kRemoteSuggestionCategories[] = "ntp_snippets.remote_categories";
 
-const char kSnippetLastFetchAttempt[] =
-    "ntp_snippets.last_fetch_attempt";
+const char kSnippetLastFetchAttempt[] = "ntp_snippets.last_fetch_attempt";
 
 const char kSnippetSoftFetchingIntervalOnUsageEvent[] =
     "ntp_snippets.soft_fetching_interval_on_usage_event";
diff --git a/components/ntp_snippets/remote/remote_suggestion.cc b/components/ntp_snippets/remote/remote_suggestion.cc
index 714e0168..a60c072 100644
--- a/components/ntp_snippets/remote/remote_suggestion.cc
+++ b/components/ntp_snippets/remote/remote_suggestion.cc
@@ -151,8 +151,8 @@
     // Expected to not have AMP url sometimes.
     if (dict_value->GetString("ampUrl", &amp_url_str)) {
       amp_url = GURL(amp_url_str);
-      DLOG_IF(WARNING, !amp_url.is_valid()) << "Invalid AMP url "
-                                            << amp_url_str;
+      DLOG_IF(WARNING, !amp_url.is_valid())
+          << "Invalid AMP url " << amp_url_str;
     }
     sources.emplace_back(corpus_id, site_title,
                          amp_url.is_valid() ? amp_url : GURL());
@@ -308,8 +308,8 @@
     GURL amp_url;
     if (source_proto.has_amp_url()) {
       amp_url = GURL(source_proto.amp_url());
-      DLOG_IF(WARNING, !amp_url.is_valid()) << "Invalid AMP URL "
-                                            << source_proto.amp_url();
+      DLOG_IF(WARNING, !amp_url.is_valid())
+          << "Invalid AMP URL " << source_proto.amp_url();
     }
 
     sources.emplace_back(url, source_proto.publisher_name(), amp_url);
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher.cc b/components/ntp_snippets/remote/remote_suggestions_fetcher.cc
index c7218ee..080e06c 100644
--- a/components/ntp_snippets/remote/remote_suggestions_fetcher.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_fetcher.cc
@@ -392,8 +392,8 @@
     FetchFinished(OptionalFetchedCategories(),
                   std::move(builder_and_callback.second),
                   FetchResult::OAUTH_TOKEN_ERROR,
-                  /*error_details=*/base::StringPrintf(
-                      " (%s)", error.ToString().c_str()));
+                  /*error_details=*/
+                  base::StringPrintf(" (%s)", error.ToString().c_str()));
     pending_requests_.pop();
   }
 }
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc b/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc
index 714c821..77b57ec 100644
--- a/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc
@@ -503,8 +503,7 @@
                                        /*count=*/1)));
 }
 
-TEST_F(RemoteSuggestionsSignedInFetcherTest,
-       ShouldRetryWhenOAuthCancelled) {
+TEST_F(RemoteSuggestionsSignedInFetcherTest, ShouldRetryWhenOAuthCancelled) {
   SignIn();
   IssueRefreshToken();
 
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc b/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc
index ee3bafe5..f2039ae 100644
--- a/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc
@@ -907,11 +907,12 @@
   EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()),
               ElementsAre(IdEq("http://first")));
 
-  auto expect_only_second_suggestion_received = base::Bind([](
-      Status status, std::vector<ContentSuggestion> suggestions) {
-    EXPECT_THAT(suggestions, SizeIs(1));
-    EXPECT_THAT(suggestions[0].id().id_within_category(), Eq("http://second"));
-  });
+  auto expect_only_second_suggestion_received =
+      base::Bind([](Status status, std::vector<ContentSuggestion> suggestions) {
+        EXPECT_THAT(suggestions, SizeIs(1));
+        EXPECT_THAT(suggestions[0].id().id_within_category(),
+                    Eq("http://second"));
+      });
   LoadMoreFromJSONString(service.get(), articles_category(),
                          GetTestJson({GetSuggestionWithUrl("http://second")}),
                          /*known_ids=*/std::set<std::string>(),
@@ -984,9 +985,10 @@
       service.get(), articles_category(),
       GetTestJson({GetSuggestionWithUrl("http://more-id-1"),
                    GetSuggestionWithUrl("http://more-id-2")}),
-      /*known_ids=*/{"http://id-1", "http://id-2", "http://id-3", "http://id-4",
-                     "http://id-5", "http://id-6", "http://id-7", "http://id-8",
-                     "http://id-9", "http://id-10"},
+      /*known_ids=*/
+      {"http://id-1", "http://id-2", "http://id-3", "http://id-4",
+       "http://id-5", "http://id-6", "http://id-7", "http://id-8",
+       "http://id-9", "http://id-10"},
       expect_receiving_two_new_suggestions);
 
   // Verify that the observer received the update as well. We should see the
@@ -1096,9 +1098,10 @@
                    GetSuggestionWithUrl("http://more-id-8"),
                    GetSuggestionWithUrl("http://more-id-9"),
                    GetSuggestionWithUrl("http://more-id-10")}),
-      /*known_ids=*/{"http://id-1", "http://id-2", "http://id-3", "http://id-4",
-                     "http://id-5", "http://id-6", "http://id-7", "http://id-8",
-                     "http://id-9", "http://id-10"},
+      /*known_ids=*/
+      {"http://id-1", "http://id-2", "http://id-3", "http://id-4",
+       "http://id-5", "http://id-6", "http://id-7", "http://id-8",
+       "http://id-9", "http://id-10"},
       expect_receiving_ten_new_suggestions);
   EXPECT_THAT(observer().SuggestionsForCategory(articles_category()),
               ElementsAre(IdWithinCategoryEq("http://more-id-1"),
diff --git a/components/ntp_snippets/remote/request_throttler.cc b/components/ntp_snippets/remote/request_throttler.cc
index bba80a2..efe5636 100644
--- a/components/ntp_snippets/remote/request_throttler.cc
+++ b/components/ntp_snippets/remote/request_throttler.cc
@@ -41,12 +41,12 @@
 }  // namespace
 
 struct RequestThrottler::RequestTypeInfo {
-    const char* name;
-    const char* count_pref;
-    const char* interactive_count_pref;
-    const char* day_pref;
-    const int default_quota;
-    const int default_interactive_quota;
+  const char* name;
+  const char* count_pref;
+  const char* interactive_count_pref;
+  const char* day_pref;
+  const int default_quota;
+  const int default_interactive_quota;
 };
 
 // When adding a new type here, extend also the "RequestThrottlerTypes"
@@ -82,8 +82,7 @@
       base::StringPrintf("quota_%s", GetRequestTypeName()));
   if (!base::StringToInt(quota, &quota_)) {
     LOG_IF(WARNING, !quota.empty())
-        << "Invalid variation parameter for quota for "
-        << GetRequestTypeName();
+        << "Invalid variation parameter for quota for " << GetRequestTypeName();
     quota_ = type_info_.default_quota;
   }
 
diff --git a/components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h b/components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h
index 32f1964..00bd44d 100644
--- a/components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h
+++ b/components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h
@@ -112,15 +112,15 @@
  private:
   // Abstract description of the fetching schedule.
   struct FetchingSchedule {
-      static FetchingSchedule Empty();
-      bool operator==(const FetchingSchedule& other) const;
-      bool operator!=(const FetchingSchedule& other) const;
-      bool is_empty() const;
+    static FetchingSchedule Empty();
+    bool operator==(const FetchingSchedule& other) const;
+    bool operator!=(const FetchingSchedule& other) const;
+    bool is_empty() const;
 
-      base::TimeDelta interval_persistent_wifi;
-      base::TimeDelta interval_persistent_fallback;
-      base::TimeDelta interval_soft_on_usage_event;
-      base::TimeDelta interval_soft_on_ntp_opened;
+    base::TimeDelta interval_persistent_wifi;
+    base::TimeDelta interval_persistent_fallback;
+    base::TimeDelta interval_soft_on_usage_event;
+    base::TimeDelta interval_soft_on_ntp_opened;
   };
 
   enum class TriggerType;
diff --git a/components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc b/components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc
index 7c54570..19dbd2c 100644
--- a/components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc
+++ b/components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc
@@ -113,8 +113,7 @@
 
 }  // namespace
 
-class SchedulingRemoteSuggestionsProviderTest
-    : public ::testing::Test {
+class SchedulingRemoteSuggestionsProviderTest : public ::testing::Test {
  public:
   SchedulingRemoteSuggestionsProviderTest()
       :  // For the test we enabled all trigger types.
diff --git a/components/ntp_snippets/sessions/foreign_sessions_suggestions_provider.cc b/components/ntp_snippets/sessions/foreign_sessions_suggestions_provider.cc
index a7c777b..571ca6e 100644
--- a/components/ntp_snippets/sessions/foreign_sessions_suggestions_provider.cc
+++ b/components/ntp_snippets/sessions/foreign_sessions_suggestions_provider.cc
@@ -231,11 +231,11 @@
   LOG(DFATAL)
       << "ForeignSessionsSuggestionsProvider has no |Fetch| functionality!";
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::Bind(callback, Status(StatusCode::PERMANENT_ERROR,
-                                  "ForeignSessionsSuggestionsProvider "
-                                  "has no |Fetch| functionality!"),
-                 base::Passed(std::vector<ContentSuggestion>())));
+      FROM_HERE, base::Bind(callback,
+                            Status(StatusCode::PERMANENT_ERROR,
+                                   "ForeignSessionsSuggestionsProvider "
+                                   "has no |Fetch| functionality!"),
+                            base::Passed(std::vector<ContentSuggestion>())));
 }
 
 void ForeignSessionsSuggestionsProvider::ClearHistory(
diff --git a/components/ntp_snippets/user_classifier.cc b/components/ntp_snippets/user_classifier.cc
index db91d80..92b0312d 100644
--- a/components/ntp_snippets/user_classifier.cc
+++ b/components/ntp_snippets/user_classifier.cc
@@ -24,8 +24,7 @@
 // The discount rate for computing the discounted-average metrics. Must be
 // strictly larger than 0 and strictly smaller than 1!
 const double kDiscountRatePerDay = 0.25;
-const char kDiscountRatePerDayParam[] =
-    "user_classifier_discount_rate_per_day";
+const char kDiscountRatePerDayParam[] = "user_classifier_discount_rate_per_day";
 
 // Never consider any larger interval than this (so that extreme situations such
 // as losing your phone or going for a long offline vacation do not skew the
@@ -331,7 +330,7 @@
   // Add 1 to the discounted metric as the event has happened right now.
   double new_metric_value =
       1 + DiscountMetric(metric_value, hours_since_last_time,
-                          discount_rate_per_hour_);
+                         discount_rate_per_hour_);
   SetMetricValue(metric, new_metric_value);
   return new_metric_value;
 }
diff --git a/components/ntp_tiles/popular_sites_impl.cc b/components/ntp_tiles/popular_sites_impl.cc
index 97867178..f0c29e5 100644
--- a/components/ntp_tiles/popular_sites_impl.cc
+++ b/components/ntp_tiles/popular_sites_impl.cc
@@ -380,8 +380,9 @@
     return;
   }
 
-  parse_json_.Run(json_string, base::Bind(&PopularSitesImpl::OnJsonParsed,
-                                          weak_ptr_factory_.GetWeakPtr()),
+  parse_json_.Run(json_string,
+                  base::Bind(&PopularSitesImpl::OnJsonParsed,
+                             weak_ptr_factory_.GetWeakPtr()),
                   base::Bind(&PopularSitesImpl::OnJsonParseFailed,
                              weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/components/ntp_tiles/switches.cc b/components/ntp_tiles/switches.cc
index 6a76ba1..9ae60506 100644
--- a/components/ntp_tiles/switches.cc
+++ b/components/ntp_tiles/switches.cc
@@ -13,10 +13,10 @@
     "enable-ntp-search-engine-country-detection";
 
 // Enables showing popular sites on the NTP.
-const char kEnableNTPPopularSites[]         = "enable-ntp-popular-sites";
+const char kEnableNTPPopularSites[] = "enable-ntp-popular-sites";
 
 // Disables showing popular sites on the NTP.
-const char kDisableNTPPopularSites[]        = "disable-ntp-popular-sites";
+const char kDisableNTPPopularSites[] = "disable-ntp-popular-sites";
 
 }  // namespace switches
 }  // namespace ntp_tiles
diff --git a/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc b/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc
index 135a89be..ef1e20c 100644
--- a/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc
+++ b/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc
@@ -159,8 +159,8 @@
     return;
   }
 
-  popular_sites_json_ = FormatJson(
-      *most_visited_sites_->popular_sites()->GetCachedJson());
+  popular_sites_json_ =
+      FormatJson(*most_visited_sites_->popular_sites()->GetCachedJson());
   SendSourceInfo();
 }
 
diff --git a/components/password_manager/OWNERS b/components/password_manager/OWNERS
index 206695fd..568d03ba 100644
--- a/components/password_manager/OWNERS
+++ b/components/password_manager/OWNERS
@@ -1,6 +1,5 @@
 dvadym@chromium.org
 engedy@chromium.org
-gcasto@chromium.org
 melandory@chromium.org
 mkwst@chromium.org
 vabr@chromium.org
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index fba230e1d..f8d0b91c 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -85,8 +85,9 @@
 
 void PaymentRequest::CanMakePayment() {
   // TODO(crbug.com/704676): Implement a quota policy for this method.
+  // PaymentRequest.canMakePayments() never returns false in incognito mode.
   client_->OnCanMakePayment(
-      state()->CanMakePayment()
+      delegate_->IsIncognito() || state()->CanMakePayment()
           ? mojom::CanMakePaymentQueryResult::CAN_MAKE_PAYMENT
           : mojom::CanMakePaymentQueryResult::CANNOT_MAKE_PAYMENT);
 }
diff --git a/components/payments/content/payment_request_delegate.h b/components/payments/content/payment_request_delegate.h
index 46faaaea93..dc421cd 100644
--- a/components/payments/content/payment_request_delegate.h
+++ b/components/payments/content/payment_request_delegate.h
@@ -31,6 +31,9 @@
   virtual autofill::PersonalDataManager* GetPersonalDataManager() = 0;
 
   virtual const std::string& GetApplicationLocale() const = 0;
+
+  // Returns whether the user is in Incognito mode.
+  virtual bool IsIncognito() const = 0;
 };
 
 }  // namespace payments
diff --git a/components/payments/content/payment_request_spec.cc b/components/payments/content/payment_request_spec.cc
index 5a92e86..3435871c 100644
--- a/components/payments/content/payment_request_spec.cc
+++ b/components/payments/content/payment_request_spec.cc
@@ -10,10 +10,7 @@
 
 namespace payments {
 
-namespace {
-// Identifier for the basic card payment method in the PaymentMethodData.
-static const char* const kBasicCardMethodName = "basic-card";
-}  // namespace
+const char kBasicCardMethodName[] = "basic-card";
 
 PaymentRequestSpec::PaymentRequestSpec(
     mojom::PaymentOptionsPtr options,
@@ -39,6 +36,11 @@
   observers_.RemoveObserver(observer);
 }
 
+bool PaymentRequestSpec::IsMethodSupportedThroughBasicCard(
+    const std::string& method_name) {
+  return basic_card_specified_networks_.count(method_name) > 0;
+}
+
 base::string16 PaymentRequestSpec::GetFormattedCurrencyAmount(
     const std::string& amount) {
   CurrencyFormatter* formatter = GetOrCreateCurrencyFormatter(
@@ -94,6 +96,8 @@
           supported_card_networks_.insert(supported_card_networks_.end(),
                                           card_networks.begin(),
                                           card_networks.end());
+          basic_card_specified_networks_.insert(card_networks.begin(),
+                                                card_networks.end());
           // Clear the set so that no further networks are added to
           // |supported_card_networks_|.
           card_networks.clear();
@@ -117,6 +121,8 @@
             auto card_it = card_networks.find(networks[supported_network]);
             if (card_it != card_networks.end()) {
               supported_card_networks_.push_back(networks[supported_network]);
+              basic_card_specified_networks_.insert(
+                  networks[supported_network]);
               card_networks.erase(card_it);
             }
           }
diff --git a/components/payments/content/payment_request_spec.h b/components/payments/content/payment_request_spec.h
index 729d7ca..dd7cb30d 100644
--- a/components/payments/content/payment_request_spec.h
+++ b/components/payments/content/payment_request_spec.h
@@ -16,6 +16,9 @@
 
 namespace payments {
 
+// Identifier for the basic card payment method in the PaymentMethodData.
+extern const char kBasicCardMethodName[];
+
 // The spec contains all the options that the merchant has specified about this
 // Payment Request. It's a (mostly) read-only view, which can be updated in
 // certain occasions by the merchant (see API).
@@ -53,6 +56,10 @@
   const std::set<std::string>& supported_card_networks_set() const {
     return supported_card_networks_set_;
   }
+  // Returns whether the |method_name| was specified as supported through the
+  // "basic-card" payment method. If false, it means either the |method_name| is
+  // not supported at all, or specified directly in supportedMethods.
+  bool IsMethodSupportedThroughBasicCard(const std::string& method_name);
 
   // Uses CurrencyFormatter to format |amount| with the currency symbol for this
   // request's currency. Will use currency of the "total" display item, because
@@ -95,6 +102,10 @@
   std::vector<std::string> supported_card_networks_;
   std::set<std::string> supported_card_networks_set_;
 
+  // Only the set of basic-card specified networks. NOTE: callers should use
+  // |supported_card_networks_set_| to check merchant support.
+  std::set<std::string> basic_card_specified_networks_;
+
   base::ObserverList<Observer> observers_;
 
   DISALLOW_COPY_AND_ASSIGN(PaymentRequestSpec);
diff --git a/components/payments/content/payment_request_spec_unittest.cc b/components/payments/content/payment_request_spec_unittest.cc
index 0c4de2b..5bea5c0 100644
--- a/components/payments/content/payment_request_spec_unittest.cc
+++ b/components/payments/content/payment_request_spec_unittest.cc
@@ -47,6 +47,63 @@
   EXPECT_EQ(0u, spec()->supported_card_networks().size());
 }
 
+TEST_F(PaymentRequestSpecTest, IsMethodSupportedThroughBasicCard) {
+  mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New();
+  entry->supported_methods.push_back("visa");
+  entry->supported_methods.push_back("mastercard");
+  entry->supported_methods.push_back("invalid");
+  entry->supported_methods.push_back("");
+  entry->supported_methods.push_back("visa");
+  mojom::PaymentMethodDataPtr entry2 = mojom::PaymentMethodData::New();
+  entry2->supported_methods.push_back("basic-card");
+  entry2->supported_networks.push_back(mojom::BasicCardNetwork::UNIONPAY);
+  entry2->supported_networks.push_back(mojom::BasicCardNetwork::JCB);
+  entry2->supported_networks.push_back(mojom::BasicCardNetwork::VISA);
+
+  std::vector<mojom::PaymentMethodDataPtr> method_data;
+  method_data.push_back(std::move(entry));
+  method_data.push_back(std::move(entry2));
+
+  RecreateSpecWithMethodData(std::move(method_data));
+
+  // Only unionpay and jcb are supported through basic-card.
+  EXPECT_TRUE(spec()->IsMethodSupportedThroughBasicCard("unionpay"));
+  EXPECT_TRUE(spec()->IsMethodSupportedThroughBasicCard("jcb"));
+  // "visa" is NOT supported through basic card because it was specified
+  // directly first in supportedMethods.
+  EXPECT_FALSE(spec()->IsMethodSupportedThroughBasicCard("visa"));
+  EXPECT_FALSE(spec()->IsMethodSupportedThroughBasicCard("mastercard"));
+  EXPECT_FALSE(spec()->IsMethodSupportedThroughBasicCard("diners"));
+  EXPECT_FALSE(spec()->IsMethodSupportedThroughBasicCard("garbage"));
+}
+
+// Order matters when parsing the supportedMethods and basic card networks.
+TEST_F(PaymentRequestSpecTest,
+       IsMethodSupportedThroughBasicCard_DifferentOrder) {
+  mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New();
+  entry->supported_methods.push_back("basic-card");
+  entry->supported_networks.push_back(mojom::BasicCardNetwork::UNIONPAY);
+  entry->supported_networks.push_back(mojom::BasicCardNetwork::VISA);
+  mojom::PaymentMethodDataPtr entry2 = mojom::PaymentMethodData::New();
+  entry2->supported_methods.push_back("visa");
+  entry2->supported_methods.push_back("unionpay");
+  entry2->supported_methods.push_back("jcb");
+
+  std::vector<mojom::PaymentMethodDataPtr> method_data;
+  method_data.push_back(std::move(entry));
+  method_data.push_back(std::move(entry2));
+
+  RecreateSpecWithMethodData(std::move(method_data));
+
+  // unionpay and visa are supported through basic-card; they were specified
+  // first as basic card networks.
+  EXPECT_TRUE(spec()->IsMethodSupportedThroughBasicCard("unionpay"));
+  EXPECT_TRUE(spec()->IsMethodSupportedThroughBasicCard("visa"));
+  // "jcb" is NOT supported through basic card; it was specified directly
+  // as a supportedMethods
+  EXPECT_FALSE(spec()->IsMethodSupportedThroughBasicCard("jcb"));
+}
+
 // Test that parsing supported methods (with invalid values and duplicates)
 // works as expected.
 TEST_F(PaymentRequestSpecTest, SupportedMethods) {
diff --git a/components/payments/content/payment_request_state.cc b/components/payments/content/payment_request_state.cc
index f727b09..47fe27f 100644
--- a/components/payments/content/payment_request_state.cc
+++ b/components/payments/content/payment_request_state.cc
@@ -35,7 +35,6 @@
 }
 
 bool PaymentRequestState::CanMakePayment() const {
-  // TODO(crbug.com/704675): Handle incognito mode when replying to this method.
   for (const std::unique_ptr<PaymentInstrument>& instrument :
        available_instruments_) {
     if (instrument.get()->IsValid() &&
@@ -63,7 +62,13 @@
   // TODO(mathp): Fill other fields in the PaymentResponsePtr object.
   mojom::PaymentResponsePtr payment_response = mojom::PaymentResponse::New();
 
-  payment_response->method_name = method_name;
+  // Make sure that we return the method name that the merchant specified for
+  // this instrument: cards can be either specified through their name (e.g.,
+  // "visa") or through basic-card's supportedNetworks.
+  payment_response->method_name =
+      spec_->IsMethodSupportedThroughBasicCard(method_name)
+          ? kBasicCardMethodName
+          : method_name;
   payment_response->stringified_details = stringified_details;
   delegate_->OnPaymentResponseAvailable(std::move(payment_response));
 }
diff --git a/components/payments/content/payment_request_state_unittest.cc b/components/payments/content/payment_request_state_unittest.cc
index 65293eab..3f1ac11 100644
--- a/components/payments/content/payment_request_state_unittest.cc
+++ b/components/payments/content/payment_request_state_unittest.cc
@@ -273,7 +273,7 @@
 }
 
 // Test generating a PaymentResponse.
-TEST_F(PaymentRequestStateTest, GeneratePaymentResponse) {
+TEST_F(PaymentRequestStateTest, GeneratePaymentResponse_SupportedMethod) {
   // Default options (no shipping, no contact info).
   RecreateStateWithOptions(mojom::PaymentOptions::New());
   state()->SetSelectedInstrument(state()->available_instruments()[0].get());
@@ -281,6 +281,8 @@
   EXPECT_TRUE(state()->is_ready_to_pay());
 
   // TODO(mathp): Currently synchronous, when async will need a RunLoop.
+  // "visa" is specified directly in the supportedMethods so it is returned
+  // as the method name.
   state()->GeneratePaymentResponse();
   EXPECT_EQ("visa", response()->method_name);
   EXPECT_EQ(
@@ -301,4 +303,41 @@
       response()->stringified_details);
 }
 
+// Test generating a PaymentResponse when the method is specified through
+// "basic-card".
+TEST_F(PaymentRequestStateTest, GeneratePaymentResponse_BasicCard) {
+  // The method data supports visa through basic-card.
+  mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New();
+  entry->supported_methods.push_back("basic-card");
+  entry->supported_networks.push_back(mojom::BasicCardNetwork::VISA);
+  std::vector<mojom::PaymentMethodDataPtr> method_data;
+  method_data.push_back(std::move(entry));
+  RecreateStateWithOptionsAndDetails(mojom::PaymentOptions::New(),
+                                     mojom::PaymentDetails::New(),
+                                     std::move(method_data));
+
+  EXPECT_TRUE(state()->is_ready_to_pay());
+
+  // TODO(mathp): Currently synchronous, when async will need a RunLoop.
+  // "basic-card" is specified so it is returned as the method name.
+  state()->GeneratePaymentResponse();
+  EXPECT_EQ("basic-card", response()->method_name);
+  EXPECT_EQ(
+      "{\"billingAddress\":"
+      "{\"addressLine\":[\"666 Erebus St.\",\"Apt 8\"],"
+      "\"city\":\"Elysium\","
+      "\"country\":\"US\","
+      "\"organization\":\"Underworld\","
+      "\"phone\":\"16502111111\","
+      "\"postalCode\":\"91111\","
+      "\"recipient\":\"John H. Doe\","
+      "\"region\":\"CA\"},"
+      "\"cardNumber\":\"4111111111111111\","
+      "\"cardSecurityCode\":\"123\","
+      "\"cardholderName\":\"Test User\","
+      "\"expiryMonth\":\"11\","
+      "\"expiryYear\":\"2017\"}",
+      response()->stringified_details);
+}
+
 }  // namespace payments
diff --git a/components/previews/core/previews_experiments.cc b/components/previews/core/previews_experiments.cc
index 7b6d539..e8d738aa 100644
--- a/components/previews/core/previews_experiments.cc
+++ b/components/previews/core/previews_experiments.cc
@@ -4,14 +4,13 @@
 
 #include "components/previews/core/previews_experiments.h"
 
-#include <map>
 #include <string>
 
 #include "base/logging.h"
 #include "base/metrics/field_trial.h"
+#include "base/metrics/field_trial_params.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "components/variations/variations_associated_data.h"
 
 namespace previews {
 
@@ -31,45 +30,6 @@
 // result in older blacklist entries being removed.
 const char kVersion[] = "version";
 
-// The maximum number of recent previews navigations the black list looks at to
-// determine if a host is blacklisted.
-const char kMaxStoredHistoryLengthPerHost[] =
-    "per_host_max_stored_history_length";
-
-// The maximum number of recent previews navigations the black list looks at to
-// determine if all previews navigations should be disallowed.
-const char kMaxStoredHistoryLengthHostIndifferent[] =
-    "host_indifferent_max_stored_history_length";
-
-// The maximum number of hosts allowed in the in memory black list.
-const char kMaxHostsInBlackList[] = "max_hosts_in_blacklist";
-
-// The number of recent navigations that were opted out of that would trigger
-// the host to be blacklisted.
-const char kPerHostOptOutThreshold[] = "per_host_opt_out_threshold";
-
-// The number of recent navigations that were opted out of that would trigger
-// all previews navigations to be disallowed.
-const char kHostIndifferentOptOutThreshold[] =
-    "host_indifferent_opt_out_threshold";
-
-// The amount of time a host remains blacklisted due to opt outs.
-const char kPerHostBlackListDurationInDays[] =
-    "per_host_black_list_duration_in_days";
-
-// The amount of time a host remains blacklisted due to opt outs.
-const char kHostIndifferentBlackListDurationInDays[] =
-    "host_indifferent_black_list_duration_in_days";
-
-// The amount of time after any opt out that no previews should be shown.
-const char kSingleOptOutDurationInSeconds[] =
-    "single_opt_out_duration_in_seconds";
-
-// The amount of time that an offline page is considered fresh enough to be
-// shown as a preview.
-const char kOfflinePreviewFreshnessDurationInDays[] =
-    "offline_preview_freshness_duration_in_days";
-
 // The threshold of EffectiveConnectionType above which previews will not be
 // served.
 // See net/nqe/effective_connection_type.h for mapping from string to value.
@@ -79,19 +39,40 @@
 // The string that corresponds to enabled for the variation param experiments.
 const char kExperimentEnabled[] = "true";
 
-// Returns the ClientSidePreviews parameter value of |param| as a string.
-// If there is no value for |param|, returns an empty string.
-std::string ClientSidePreviewsParamValue(const std::string& param) {
-  if (!IsIncludedInClientSidePreviewsExperimentsFieldTrial())
-    return std::string();
-  std::map<std::string, std::string> experiment_params;
-  if (!variations::GetVariationParams(kClientSidePreviewsFieldTrial,
-                                      &experiment_params)) {
-    return std::string();
+const char kClientLoFiExperimentName[] = "PreviewsClientLoFi";
+
+size_t GetParamValueAsSizeT(const std::string& trial_name,
+                            const std::string& param_name,
+                            size_t default_value) {
+  size_t value;
+  if (!base::StringToSizeT(
+          base::GetFieldTrialParamValue(trial_name, param_name), &value)) {
+    return default_value;
   }
-  std::map<std::string, std::string>::const_iterator it =
-      experiment_params.find(param);
-  return it == experiment_params.end() ? std::string() : it->second;
+  return value;
+}
+
+int GetParamValueAsInt(const std::string& trial_name,
+                       const std::string& param_name,
+                       int default_value) {
+  int value;
+  if (!base::StringToInt(base::GetFieldTrialParamValue(trial_name, param_name),
+                         &value)) {
+    return default_value;
+  }
+  return value;
+}
+
+net::EffectiveConnectionType GetParamValueAsECT(
+    const std::string& trial_name,
+    const std::string& param_name,
+    net::EffectiveConnectionType default_value) {
+  net::EffectiveConnectionType value;
+  if (!net::GetEffectiveConnectionTypeForName(
+          base::GetFieldTrialParamValue(trial_name, param_name), &value)) {
+    return default_value;
+  }
+  return value;
 }
 
 }  // namespace
@@ -99,107 +80,86 @@
 namespace params {
 
 size_t MaxStoredHistoryLengthForPerHostBlackList() {
-  std::string param_value =
-      ClientSidePreviewsParamValue(kMaxStoredHistoryLengthPerHost);
-  size_t history_length;
-  if (!base::StringToSizeT(param_value, &history_length))
-    history_length = 4;
-  return history_length;
+  return GetParamValueAsSizeT(kClientSidePreviewsFieldTrial,
+                              "per_host_max_stored_history_length", 4);
 }
 
 size_t MaxStoredHistoryLengthForHostIndifferentBlackList() {
-  std::string param_value =
-      ClientSidePreviewsParamValue(kMaxStoredHistoryLengthHostIndifferent);
-  size_t history_length;
-  if (!base::StringToSizeT(param_value, &history_length))
-    history_length = 10;
-  return history_length;
+  return GetParamValueAsSizeT(kClientSidePreviewsFieldTrial,
+                              "host_indifferent_max_stored_history_length", 10);
 }
 
 size_t MaxInMemoryHostsInBlackList() {
-  std::string param_value = ClientSidePreviewsParamValue(kMaxHostsInBlackList);
-  size_t max_hosts;
-  if (!base::StringToSizeT(param_value, &max_hosts))
-    max_hosts = 100;
-  return max_hosts;
+  return GetParamValueAsSizeT(kClientSidePreviewsFieldTrial,
+                              "max_hosts_in_blacklist", 100);
 }
 
 int PerHostBlackListOptOutThreshold() {
-  std::string param_value =
-      ClientSidePreviewsParamValue(kPerHostOptOutThreshold);
-  int opt_out_threshold;
-  if (!base::StringToInt(param_value, &opt_out_threshold))
-    opt_out_threshold = 2;
-  return opt_out_threshold;
+  return GetParamValueAsInt(kClientSidePreviewsFieldTrial,
+                            "per_host_opt_out_threshold", 2);
 }
 
 int HostIndifferentBlackListOptOutThreshold() {
-  std::string param_value =
-      ClientSidePreviewsParamValue(kHostIndifferentOptOutThreshold);
-  int opt_out_threshold;
-  if (!base::StringToInt(param_value, &opt_out_threshold))
-    opt_out_threshold = 4;
-  return opt_out_threshold;
+  return GetParamValueAsInt(kClientSidePreviewsFieldTrial,
+                            "host_indifferent_opt_out_threshold", 4);
 }
 
 base::TimeDelta PerHostBlackListDuration() {
-  std::string param_value =
-      ClientSidePreviewsParamValue(kPerHostBlackListDurationInDays);
-  int duration;
-  if (!base::StringToInt(param_value, &duration))
-    duration = 30;
-  return base::TimeDelta::FromDays(duration);
+  return base::TimeDelta::FromDays(
+      GetParamValueAsInt(kClientSidePreviewsFieldTrial,
+                         "per_host_black_list_duration_in_days", 30));
 }
 
 base::TimeDelta HostIndifferentBlackListPerHostDuration() {
-  std::string param_value =
-      ClientSidePreviewsParamValue(kHostIndifferentBlackListDurationInDays);
-  int duration;
-  if (!base::StringToInt(param_value, &duration))
-    duration = 365 * 100;
-  return base::TimeDelta::FromDays(duration);
+  return base::TimeDelta::FromDays(GetParamValueAsInt(
+      kClientSidePreviewsFieldTrial,
+      "host_indifferent_black_list_duration_in_days", 365 * 100));
 }
 
 base::TimeDelta SingleOptOutDuration() {
-  std::string param_value =
-      ClientSidePreviewsParamValue(kSingleOptOutDurationInSeconds);
-  int duration;
-  if (!base::StringToInt(param_value, &duration))
-    duration = 60 * 5;
-  return base::TimeDelta::FromSeconds(duration);
+  return base::TimeDelta::FromSeconds(
+      GetParamValueAsInt(kClientSidePreviewsFieldTrial,
+                         "single_opt_out_duration_in_seconds", 60 * 5));
 }
 
 base::TimeDelta OfflinePreviewFreshnessDuration() {
-  std::string param_value =
-      ClientSidePreviewsParamValue(kOfflinePreviewFreshnessDurationInDays);
-  int duration;
-  if (!base::StringToInt(param_value, &duration))
-    duration = 7;
-  return base::TimeDelta::FromDays(duration);
+  return base::TimeDelta::FromDays(
+      GetParamValueAsInt(kClientSidePreviewsFieldTrial,
+                         "offline_preview_freshness_duration_in_days", 7));
 }
 
-net::EffectiveConnectionType EffectiveConnectionTypeThreshold() {
-  std::string param_value =
-      ClientSidePreviewsParamValue(kEffectiveConnectionTypeThreshold);
-  net::EffectiveConnectionType effective_connection_type;
-  if (!net::GetEffectiveConnectionTypeForName(param_value,
-                                              &effective_connection_type)) {
-    effective_connection_type = net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
-  }
-  return effective_connection_type;
+net::EffectiveConnectionType EffectiveConnectionTypeThresholdForOffline() {
+  return GetParamValueAsECT(kClientSidePreviewsFieldTrial,
+                            kEffectiveConnectionTypeThreshold,
+                            net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G);
 }
 
 bool IsOfflinePreviewsEnabled() {
   //  Check if "show_offline_pages" is set to "true".
-  return ClientSidePreviewsParamValue(kOfflinePagesSlowNetwork) ==
-         kExperimentEnabled;
+  return IsIncludedInClientSidePreviewsExperimentsFieldTrial() &&
+         base::GetFieldTrialParamValue(kClientSidePreviewsFieldTrial,
+                                       kOfflinePagesSlowNetwork) ==
+             kExperimentEnabled;
 }
 
 int OfflinePreviewsVersion() {
-  int version;
-  if (!base::StringToInt(ClientSidePreviewsParamValue(kVersion), &version))
-    version = 0;
-  return version;
+  return GetParamValueAsInt(kClientSidePreviewsFieldTrial, kVersion, 0);
+}
+
+bool IsClientLoFiEnabled() {
+  return base::StartsWith(
+      base::FieldTrialList::FindFullName(kClientLoFiExperimentName), kEnabled,
+      base::CompareCase::SENSITIVE);
+}
+
+int ClientLoFiVersion() {
+  return GetParamValueAsInt(kClientLoFiExperimentName, kVersion, 0);
+}
+
+net::EffectiveConnectionType EffectiveConnectionTypeThresholdForClientLoFi() {
+  return GetParamValueAsECT(kClientLoFiExperimentName,
+                            kEffectiveConnectionTypeThreshold,
+                            net::EFFECTIVE_CONNECTION_TYPE_2G);
 }
 
 }  // namespace params
@@ -213,13 +173,4 @@
       kEnabled, base::CompareCase::SENSITIVE);
 }
 
-bool EnableOfflinePreviewsForTesting() {
-  std::map<std::string, std::string> params;
-  params[kOfflinePagesSlowNetwork] = kExperimentEnabled;
-  return variations::AssociateVariationParams(kClientSidePreviewsFieldTrial,
-                                              kEnabled, params) &&
-         base::FieldTrialList::CreateFieldTrial(kClientSidePreviewsFieldTrial,
-                                                kEnabled);
-}
-
 }  // namespace previews
diff --git a/components/previews/core/previews_experiments.h b/components/previews/core/previews_experiments.h
index a41f02fe..7dd7bc2 100644
--- a/components/previews/core/previews_experiments.h
+++ b/components/previews/core/previews_experiments.h
@@ -5,7 +5,6 @@
 #ifndef COMPONENTS_PREVIEWS_CORE_PREVIEWS_EXPERIMENTS_H_
 #define COMPONENTS_PREVIEWS_CORE_PREVIEWS_EXPERIMENTS_H_
 
-#include <memory>
 #include <utility>
 #include <vector>
 
@@ -48,9 +47,9 @@
 // shown as a preview.
 base::TimeDelta OfflinePreviewFreshnessDuration();
 
-// The threshold of EffectiveConnectionType above which previews should not be
-// served.
-net::EffectiveConnectionType EffectiveConnectionTypeThreshold();
+// The threshold of EffectiveConnectionType above which offline previews should
+// not be served.
+net::EffectiveConnectionType EffectiveConnectionTypeThresholdForOffline();
 
 // Whether offline previews are enabled.
 bool IsOfflinePreviewsEnabled();
@@ -58,15 +57,30 @@
 // The blacklist version for offline previews.
 int OfflinePreviewsVersion();
 
+// Whether Client LoFi previews are enabled.
+bool IsClientLoFiEnabled();
+
+// The blacklist version for Client LoFi previews.
+int ClientLoFiVersion();
+
+// The threshold of EffectiveConnectionType above which Client LoFi previews
+// should not be served.
+net::EffectiveConnectionType EffectiveConnectionTypeThresholdForClientLoFi();
+
 }  // namespace params
 
 enum class PreviewsType {
   NONE = 0,
+
   // The user is shown an offline page as a preview.
   OFFLINE = 1,
+
+  // Replace images with placeholders generated on the client.
+  CLIENT_LOFI = 2,
+
   // Insert new enum values here. Keep values sequential to allow looping
   // from NONE+1 to LAST-1.
-  LAST = 2,
+  LAST = 3,
 };
 
 typedef std::vector<std::pair<PreviewsType, int>> PreviewsTypeList;
@@ -74,10 +88,6 @@
 // Returns true if any client-side previews experiment is active.
 bool IsIncludedInClientSidePreviewsExperimentsFieldTrial();
 
-// Sets the appropriate state for field trial and variations to imitate the
-// offline pages field trial.
-bool EnableOfflinePreviewsForTesting();
-
 }  // namespace previews
 
 #endif  // COMPONENTS_PREVIEWS_CORE_PREVIEWS_EXPERIMENTS_H_
diff --git a/components/previews/core/previews_experiments_unittest.cc b/components/previews/core/previews_experiments_unittest.cc
index f96fb55..be81b3d 100644
--- a/components/previews/core/previews_experiments_unittest.cc
+++ b/components/previews/core/previews_experiments_unittest.cc
@@ -4,10 +4,11 @@
 
 #include "components/previews/core/previews_experiments.h"
 
+#include <map>
 #include <string>
 
 #include "base/metrics/field_trial.h"
-#include "base/strings/string_number_conversions.h"
+#include "base/metrics/field_trial_params.h"
 #include "base/strings/string_util.h"
 #include "components/variations/variations_associated_data.h"
 
@@ -17,22 +18,33 @@
 
 namespace {
 
-using PreviewsExperimentsTest = testing::Test;
+const char kClientSidePreviewsFieldTrial[] = "ClientSidePreviews";
+const char kClientLoFiFieldTrial[] = "PreviewsClientLoFi";
+const char kEnabled[] = "Enabled";
 
-// Used as field trial values. Somewhat random yet valid values.
-const char kMaxStoredHistoryLengthPerHost[] = "3";
-const char kMaxStoredHistoryLengthHostIndifferent[] = "4";
-const char kMaxHostsInBlackList[] = "13";
-const char kPerHostOptOutThreshold[] = "12";
-const char kHostIndifferentOptOutThreshold[] = "84";
-const char kPerHostBlackListDurationInDays[] = "99";
-const char kHostIndifferentBlackListDurationInDays[] = "64";
-const char kSingleOptOutDurationInSeconds[] = "28";
-const char kOfflinePreviewFreshnessDurationInDays[] = "12";
-const char kEffectiveConnectionTypeThreshold[] = "4G";
+// Verifies that we can enable offline previews via field trial.
+TEST(PreviewsExperimentsTest, TestFieldTrialOfflinePage) {
+  EXPECT_FALSE(IsIncludedInClientSidePreviewsExperimentsFieldTrial());
+  EXPECT_FALSE(params::IsOfflinePreviewsEnabled());
 
-// Verifies that the default params are the expected values.
-void VerifyDefaultParams() {
+  base::FieldTrialList field_trial_list(nullptr);
+
+  std::map<std::string, std::string> params;
+  params["show_offline_pages"] = "true";
+  EXPECT_TRUE(base::AssociateFieldTrialParams(kClientSidePreviewsFieldTrial,
+                                              kEnabled, params));
+  EXPECT_TRUE(base::FieldTrialList::CreateFieldTrial(
+      kClientSidePreviewsFieldTrial, kEnabled));
+
+  EXPECT_TRUE(IsIncludedInClientSidePreviewsExperimentsFieldTrial());
+  EXPECT_TRUE(params::IsOfflinePreviewsEnabled());
+  variations::testing::ClearAllVariationParams();
+}
+
+// Verifies that the default params are correct, and that custom params can be
+// set, for both the previews blacklist and offline previews.
+TEST(PreviewsExperimentsTest, TestParamsForBlackListAndOffline) {
+  // Verify that the default params are correct.
   EXPECT_EQ(4u, params::MaxStoredHistoryLengthForPerHostBlackList());
   EXPECT_EQ(10u, params::MaxStoredHistoryLengthForHostIndifferentBlackList());
   EXPECT_EQ(100u, params::MaxInMemoryHostsInBlackList());
@@ -46,126 +58,98 @@
   EXPECT_EQ(base::TimeDelta::FromDays(7),
             params::OfflinePreviewFreshnessDuration());
   EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G,
-            params::EffectiveConnectionTypeThreshold());
+            params::EffectiveConnectionTypeThresholdForOffline());
+  EXPECT_EQ(0, params::OfflinePreviewsVersion());
+
+  base::FieldTrialList field_trial_list(nullptr);
+
+  // Set some custom params. Somewhat random yet valid values.
+  std::map<std::string, std::string> custom_params = {
+      {"per_host_max_stored_history_length", "3"},
+      {"host_indifferent_max_stored_history_length", "4"},
+      {"max_hosts_in_blacklist", "13"},
+      {"per_host_opt_out_threshold", "12"},
+      {"host_indifferent_opt_out_threshold", "84"},
+      {"per_host_black_list_duration_in_days", "99"},
+      {"host_indifferent_black_list_duration_in_days", "64"},
+      {"single_opt_out_duration_in_seconds", "28"},
+      {"offline_preview_freshness_duration_in_days", "12"},
+      {"max_allowed_effective_connection_type", "4G"},
+      {"version", "10"},
+  };
+  EXPECT_TRUE(base::AssociateFieldTrialParams(kClientSidePreviewsFieldTrial,
+                                              kEnabled, custom_params));
+  EXPECT_TRUE(base::FieldTrialList::CreateFieldTrial(
+      kClientSidePreviewsFieldTrial, kEnabled));
+
+  EXPECT_EQ(3u, params::MaxStoredHistoryLengthForPerHostBlackList());
+  EXPECT_EQ(4u, params::MaxStoredHistoryLengthForHostIndifferentBlackList());
+  EXPECT_EQ(13u, params::MaxInMemoryHostsInBlackList());
+  EXPECT_EQ(12, params::PerHostBlackListOptOutThreshold());
+  EXPECT_EQ(84, params::HostIndifferentBlackListOptOutThreshold());
+  EXPECT_EQ(base::TimeDelta::FromDays(99), params::PerHostBlackListDuration());
+  EXPECT_EQ(base::TimeDelta::FromDays(64),
+            params::HostIndifferentBlackListPerHostDuration());
+  EXPECT_EQ(base::TimeDelta::FromSeconds(28), params::SingleOptOutDuration());
+  EXPECT_EQ(base::TimeDelta::FromDays(12),
+            params::OfflinePreviewFreshnessDuration());
+  EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_4G,
+            params::EffectiveConnectionTypeThresholdForOffline());
+  EXPECT_EQ(10, params::OfflinePreviewsVersion());
+
+  variations::testing::ClearAllVariationParams();
 }
 
-// Creates a map of the params names to the const string values above.
-std::map<std::string, std::string> GetFieldTrialParams() {
-  std::map<std::string, std::string> params;
-  // Assign different values than defaults.
-  params["per_host_max_stored_history_length"] = kMaxStoredHistoryLengthPerHost;
-  params["host_indifferent_max_stored_history_length"] =
-      kMaxStoredHistoryLengthHostIndifferent;
-  params["max_hosts_in_blacklist"] = kMaxHostsInBlackList;
-  params["per_host_opt_out_threshold"] = kPerHostOptOutThreshold;
-  params["host_indifferent_opt_out_threshold"] =
-      kHostIndifferentOptOutThreshold;
-  params["per_host_black_list_duration_in_days"] =
-      kPerHostBlackListDurationInDays;
-  params["host_indifferent_black_list_duration_in_days"] =
-      kHostIndifferentBlackListDurationInDays;
-  params["single_opt_out_duration_in_seconds"] = kSingleOptOutDurationInSeconds;
-  params["offline_preview_freshness_duration_in_days"] =
-      kOfflinePreviewFreshnessDurationInDays;
-  params["max_allowed_effective_connection_type"] =
-      kEffectiveConnectionTypeThreshold;
-
-  return params;
+TEST(PreviewsExperimentsTest, TestClientLoFiDisabledByDefault) {
+  base::FieldTrialList field_trial_list(nullptr);
+  EXPECT_FALSE(params::IsClientLoFiEnabled());
 }
 
-// Verifies that calling the params methods returns the correct values based on
-// the const string values above.
-void VerifyNewParams() {
-  {
-    size_t history_length;
-    EXPECT_TRUE(
-        base::StringToSizeT(kMaxStoredHistoryLengthPerHost, &history_length));
-    EXPECT_EQ(history_length,
-              params::MaxStoredHistoryLengthForPerHostBlackList());
-  }
-  {
-    size_t history_length;
-    EXPECT_TRUE(base::StringToSizeT(kMaxStoredHistoryLengthHostIndifferent,
-                                    &history_length));
-    EXPECT_EQ(history_length,
-              params::MaxStoredHistoryLengthForHostIndifferentBlackList());
-  }
-  {
-    size_t history_length;
-    EXPECT_TRUE(base::StringToSizeT(kMaxHostsInBlackList, &history_length));
-    EXPECT_EQ(history_length, params::MaxInMemoryHostsInBlackList());
-  }
-  {
-    int threshold;
-    EXPECT_TRUE(base::StringToInt(kPerHostOptOutThreshold, &threshold));
-    EXPECT_EQ(threshold, params::PerHostBlackListOptOutThreshold());
-  }
-  {
-    int threshold;
-    EXPECT_TRUE(base::StringToInt(kHostIndifferentOptOutThreshold, &threshold));
-    EXPECT_EQ(threshold, params::HostIndifferentBlackListOptOutThreshold());
-  }
-  {
-    int days;
-    EXPECT_TRUE(base::StringToInt(kPerHostBlackListDurationInDays, &days));
-    EXPECT_EQ(base::TimeDelta::FromDays(days),
-              params::PerHostBlackListDuration());
-  }
-  {
-    int days;
-    EXPECT_TRUE(
-        base::StringToInt(kHostIndifferentBlackListDurationInDays, &days));
-    EXPECT_EQ(base::TimeDelta::FromDays(days),
-              params::HostIndifferentBlackListPerHostDuration());
-  }
-  {
-    int seconds;
-    EXPECT_TRUE(base::StringToInt(kSingleOptOutDurationInSeconds, &seconds));
-    EXPECT_EQ(base::TimeDelta::FromSeconds(seconds),
-              params::SingleOptOutDuration());
-  }
-  {
-    int days;
-    EXPECT_TRUE(
-        base::StringToInt(kOfflinePreviewFreshnessDurationInDays, &days));
-    EXPECT_EQ(base::TimeDelta::FromDays(days),
-              params::OfflinePreviewFreshnessDuration());
-  }
-  {
-    net::EffectiveConnectionType effective_connection_type;
-    EXPECT_TRUE(net::GetEffectiveConnectionTypeForName(
-        kEffectiveConnectionTypeThreshold, &effective_connection_type));
-    EXPECT_EQ(effective_connection_type,
-              params::EffectiveConnectionTypeThreshold());
-  }
+TEST(PreviewsExperimentsTest, TestClientLoFiExplicitlyDisabled) {
+  base::FieldTrialList field_trial_list(nullptr);
+  EXPECT_TRUE(
+      base::FieldTrialList::CreateFieldTrial(kClientLoFiFieldTrial, kEnabled));
+  EXPECT_TRUE(params::IsClientLoFiEnabled());
+}
+
+TEST(PreviewsExperimentsTest, TestClientLoFiEnabled) {
+  base::FieldTrialList field_trial_list(nullptr);
+  EXPECT_TRUE(
+      base::FieldTrialList::CreateFieldTrial(kClientLoFiFieldTrial, kEnabled));
+  EXPECT_TRUE(params::IsClientLoFiEnabled());
+}
+
+TEST(PreviewsExperimentsTest, TestEnableClientLoFiWithDefaultParams) {
+  base::FieldTrialList field_trial_list(nullptr);
+  EXPECT_TRUE(
+      base::FieldTrialList::CreateFieldTrial(kClientLoFiFieldTrial, kEnabled));
+
+  EXPECT_TRUE(params::IsClientLoFiEnabled());
+  EXPECT_EQ(0, params::ClientLoFiVersion());
+  EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G,
+            params::EffectiveConnectionTypeThresholdForClientLoFi());
+}
+
+TEST(PreviewsExperimentsTest, TestEnableClientLoFiWithCustomParams) {
+  base::FieldTrialList field_trial_list(nullptr);
+
+  // Set some custom params for Client LoFi.
+  std::map<std::string, std::string> custom_params = {
+      {"version", "10"}, {"max_allowed_effective_connection_type", "3G"},
+  };
+  EXPECT_TRUE(base::AssociateFieldTrialParams(kClientLoFiFieldTrial, kEnabled,
+                                              custom_params));
+  EXPECT_TRUE(
+      base::FieldTrialList::CreateFieldTrial(kClientLoFiFieldTrial, kEnabled));
+
+  EXPECT_TRUE(params::IsClientLoFiEnabled());
+  EXPECT_EQ(10, params::ClientLoFiVersion());
+  EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_3G,
+            params::EffectiveConnectionTypeThresholdForClientLoFi());
+
+  variations::testing::ClearAllVariationParams();
 }
 
 }  // namespace
 
-// Verifies that we can enable offline previews via field trial.
-TEST_F(PreviewsExperimentsTest, TestFieldTrialOfflinePage) {
-  EXPECT_FALSE(IsIncludedInClientSidePreviewsExperimentsFieldTrial());
-  EXPECT_FALSE(params::IsOfflinePreviewsEnabled());
-
-  base::FieldTrialList field_trial_list(nullptr);
-  ASSERT_TRUE(EnableOfflinePreviewsForTesting());
-
-  EXPECT_TRUE(IsIncludedInClientSidePreviewsExperimentsFieldTrial());
-  EXPECT_TRUE(params::IsOfflinePreviewsEnabled());
-  variations::testing::ClearAllVariationParams();
-}
-
-// Verifies that we can enable offline previews via field trial and that the
-// default params for previews field trials are accurate.
-TEST_F(PreviewsExperimentsTest, TestAllDefaultParams) {
-  VerifyDefaultParams();
-  base::FieldTrialList field_trial_list(nullptr);
-  EXPECT_TRUE(variations::AssociateVariationParams(
-      "ClientSidePreviews", "Enabled", GetFieldTrialParams()));
-  EXPECT_TRUE(
-      base::FieldTrialList::CreateFieldTrial("ClientSidePreviews", "Enabled"));
-  VerifyNewParams();
-  variations::testing::ClearAllVariationParams();
-}
-
 }  // namespace previews
diff --git a/components/previews/core/previews_io_data.cc b/components/previews/core/previews_io_data.cc
index 9645fa24..67403a1 100644
--- a/components/previews/core/previews_io_data.cc
+++ b/components/previews/core/previews_io_data.cc
@@ -33,11 +33,31 @@
           "Previews.EligibilityReason.Offline", static_cast<int>(status),
           static_cast<int>(PreviewsEligibilityReason::LAST));
       break;
+    case PreviewsType::CLIENT_LOFI:
+      UMA_HISTOGRAM_ENUMERATION(
+          "Previews.EligibilityReason.ClientLoFi", static_cast<int>(status),
+          static_cast<int>(PreviewsEligibilityReason::LAST));
+      break;
     default:
       NOTREACHED();
   }
 }
 
+net::EffectiveConnectionType GetEffectiveConnectionTypeThresholdForPreviewsType(
+    PreviewsType type) {
+  switch (type) {
+    case PreviewsType::OFFLINE:
+      return params::EffectiveConnectionTypeThresholdForOffline();
+    case PreviewsType::CLIENT_LOFI:
+      return params::EffectiveConnectionTypeThresholdForClientLoFi();
+    case PreviewsType::NONE:
+    case PreviewsType::LAST:
+      break;
+  }
+  NOTREACHED();
+  return net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
+}
+
 }  // namespace
 
 PreviewsIOData::PreviewsIOData(
@@ -115,8 +135,9 @@
         PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE, type);
     return false;
   }
+
   if (network_quality_estimator->GetEffectiveConnectionType() >
-      params::EffectiveConnectionTypeThreshold()) {
+      GetEffectiveConnectionTypeThresholdForPreviewsType(type)) {
     LogPreviewsEligibilityReason(PreviewsEligibilityReason::NETWORK_NOT_SLOW,
                                  type);
     return false;
@@ -124,8 +145,8 @@
   // LOAD_VALIDATE_CACHE or LOAD_BYPASS_CACHE mean the user reloaded the page.
   // If this is a query for offline previews, reloads should be disallowed.
   if (type == PreviewsType::OFFLINE &&
-      request.load_flags() &
-          (net::LOAD_VALIDATE_CACHE | net::LOAD_BYPASS_CACHE)) {
+      (request.load_flags() &
+       (net::LOAD_VALIDATE_CACHE | net::LOAD_BYPASS_CACHE))) {
     LogPreviewsEligibilityReason(
         PreviewsEligibilityReason::RELOAD_DISALLOWED_FOR_OFFLINE, type);
     return false;
diff --git a/components/previews/core/previews_io_data_unittest.cc b/components/previews/core/previews_io_data_unittest.cc
index 23b1bac..346b539 100644
--- a/components/previews/core/previews_io_data_unittest.cc
+++ b/components/previews/core/previews_io_data_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/previews/core/previews_io_data.h"
 
+#include <initializer_list>
 #include <map>
 #include <memory>
 #include <string>
@@ -15,6 +16,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/field_trial.h"
+#include "base/metrics/field_trial_params.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/test/histogram_tester.h"
@@ -37,8 +39,22 @@
 
 namespace {
 
-bool CheckOfflineFieldTrial(PreviewsType type) {
-  return previews::params::IsOfflinePreviewsEnabled();
+// TODO(sclittle): Tests should be testing the actual prod code that checks if
+// the appropriate field trial is enabled for the preview, instead of testing
+// this function here. Consider moving that code out of
+// chrome/browser/previews/previews_service.cc and into the previews/ component.
+bool IsPreviewFieldTrialEnabled(PreviewsType type) {
+  switch (type) {
+    case PreviewsType::OFFLINE:
+      return params::IsOfflinePreviewsEnabled();
+    case PreviewsType::CLIENT_LOFI:
+      return params::IsClientLoFiEnabled();
+    case PreviewsType::NONE:
+    case PreviewsType::LAST:
+      break;
+  }
+  NOTREACHED();
+  return false;
 }
 
 class TestPreviewsIOData : public PreviewsIOData {
@@ -100,52 +116,77 @@
 
 class PreviewsIODataTest : public testing::Test {
  public:
-  PreviewsIODataTest() {}
+  PreviewsIODataTest()
+      : field_trial_list_(nullptr),
+        io_data_(loop_.task_runner(), loop_.task_runner()),
+        context_(true) {
+    context_.set_network_quality_estimator(&network_quality_estimator_);
+    context_.Init();
 
-  ~PreviewsIODataTest() override {}
-
-  void set_io_data(std::unique_ptr<TestPreviewsIOData> io_data) {
-    io_data_ = std::move(io_data);
+    network_quality_estimator_.set_effective_connection_type(
+        net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
   }
 
-  TestPreviewsIOData* io_data() { return io_data_.get(); }
+  ~PreviewsIODataTest() override {
+    variations::testing::ClearAllVariationParams();
+  }
 
-  void set_ui_service(std::unique_ptr<PreviewsUIService> ui_service) {
-    ui_service_ = std::move(ui_service);
+  void InitializeUIServiceWithoutWaitingForBlackList() {
+    ui_service_.reset(new PreviewsUIService(
+        &io_data_, loop_.task_runner(),
+        std::unique_ptr<TestPreviewsOptOutStore>(new TestPreviewsOptOutStore()),
+        base::Bind(&IsPreviewFieldTrialEnabled)));
+  }
+
+  void InitializeUIService() {
+    InitializeUIServiceWithoutWaitingForBlackList();
+    base::RunLoop().RunUntilIdle();
+  }
+
+  std::unique_ptr<net::URLRequest> CreateRequest() const {
+    return context_.CreateRequest(GURL("http://example.com"),
+                                  net::DEFAULT_PRIORITY, nullptr);
+  }
+
+  TestPreviewsIOData* io_data() { return &io_data_; }
+  PreviewsUIService* ui_service() { return ui_service_.get(); }
+  net::TestURLRequestContext* context() { return &context_; }
+  net::TestNetworkQualityEstimator* network_quality_estimator() {
+    return &network_quality_estimator_;
   }
 
  protected:
-  // Run this test on a single thread.
   base::MessageLoopForIO loop_;
 
  private:
-  std::unique_ptr<TestPreviewsIOData> io_data_;
+  base::FieldTrialList field_trial_list_;
+  TestPreviewsIOData io_data_;
   std::unique_ptr<PreviewsUIService> ui_service_;
+  net::TestNetworkQualityEstimator network_quality_estimator_;
+  net::TestURLRequestContext context_;
 };
 
-}  // namespace
+void CreateFieldTrialWithParams(
+    const std::string& trial_name,
+    const std::string& group_name,
+    std::initializer_list<
+        typename std::map<std::string, std::string>::value_type> params) {
+  EXPECT_TRUE(base::AssociateFieldTrialParams(trial_name, group_name, params));
+  EXPECT_TRUE(base::FieldTrialList::CreateFieldTrial(trial_name, group_name));
+}
 
 TEST_F(PreviewsIODataTest, TestInitialization) {
-  set_io_data(base::MakeUnique<TestPreviewsIOData>(loop_.task_runner(),
-                                                   loop_.task_runner()));
-  set_ui_service(base::MakeUnique<PreviewsUIService>(
-      io_data(), loop_.task_runner(), nullptr, PreviewsIsEnabledCallback()));
-  base::RunLoop().RunUntilIdle();
+  InitializeUIService();
   // After the outstanding posted tasks have run, |io_data_| should be fully
   // initialized.
   EXPECT_TRUE(io_data()->initialized());
 }
 
-TEST_F(PreviewsIODataTest, TestShouldAllowPreview) {
-  // Test most reasons to disallow the blacklist.
-  // Excluded values are USER_RECENTLY_OPTED_OUT, USER_BLACKLISTED,
-  // HOST_BLACKLISTED. These are internal to the blacklist.
-  net::TestURLRequestContext context;
-  GURL test_host("http://www.test_host.com");
-  std::unique_ptr<net::URLRequest> request =
-      context.CreateRequest(test_host, net::DEFAULT_PRIORITY, nullptr);
-  set_io_data(base::MakeUnique<TestPreviewsIOData>(loop_.task_runner(),
-                                                   loop_.task_runner()));
+// Tests most of the reasons that a preview could be disallowed because of the
+// state of the blacklist. Excluded values are USER_RECENTLY_OPTED_OUT,
+// USER_BLACKLISTED, HOST_BLACKLISTED. These are internal to the blacklist.
+TEST_F(PreviewsIODataTest, TestDisallowPreviewBecauseOfBlackListState) {
+  std::unique_ptr<net::URLRequest> request = CreateRequest();
   base::HistogramTester histogram_tester;
 
   // The blacklist is not created yet.
@@ -154,10 +195,7 @@
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE), 1);
 
-  set_ui_service(base::MakeUnique<PreviewsUIService>(
-      io_data(), loop_.task_runner(),
-      base::MakeUnique<TestPreviewsOptOutStore>(),
-      base::Bind(&CheckOfflineFieldTrial)));
+  InitializeUIServiceWithoutWaitingForBlackList();
 
   // The blacklist is not created yet.
   EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE));
@@ -168,17 +206,10 @@
   base::RunLoop().RunUntilIdle();
 
   histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 2);
-  // If not in the field trial, don't log anything, and return false.
-  EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE));
-  histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 2);
 
   // Enable Offline previews field trial.
-  base::FieldTrialList field_trial_list(nullptr);
-  std::map<std::string, std::string> params;
-  params["show_offline_pages"] = "true";
-
-  variations::AssociateVariationParams("ClientSidePreviews", "Enabled", params);
-  base::FieldTrialList::CreateFieldTrial("ClientSidePreviews", "Enabled");
+  CreateFieldTrialWithParams("ClientSidePreviews", "Enabled",
+                             {{"show_offline_pages", "true"}});
 
   // Return one of the failing statuses from the blacklist; cause the blacklist
   // to not be loaded by clearing the blacklist.
@@ -190,59 +221,197 @@
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::BLACKLIST_DATA_NOT_LOADED),
       1);
+}
 
-  // Reload the blacklist. The blacklist should allow all navigations now.
-  base::RunLoop().RunUntilIdle();
+TEST_F(PreviewsIODataTest, TestDisallowOfflineByDefault) {
+  InitializeUIService();
 
-  // NQE should be null on the context.
-  EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE));
-  histogram_tester.ExpectBucketCount(
+  base::HistogramTester histogram_tester;
+  EXPECT_FALSE(
+      io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE));
+  histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 0);
+}
+
+TEST_F(PreviewsIODataTest, TestDisallowOfflineWhenInDisabledGroup) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("ClientSidePreviews", "Disabled",
+                             {{"show_offline_pages", "true"}});
+
+  base::HistogramTester histogram_tester;
+  EXPECT_FALSE(
+      io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE));
+  histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 0);
+}
+
+TEST_F(PreviewsIODataTest, TestDisallowOfflineWhenDisabled) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("ClientSidePreviews", "Enabled",
+                             {{"show_offline_pages", "false"}});
+
+  base::HistogramTester histogram_tester;
+  EXPECT_FALSE(
+      io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE));
+  histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 0);
+}
+
+TEST_F(PreviewsIODataTest, TestDisallowOfflineWhenNetworkQualityUnavailable) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("ClientSidePreviews", "Enabled",
+                             {{"show_offline_pages", "true"}});
+
+  network_quality_estimator()->set_effective_connection_type(
+      net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
+
+  base::HistogramTester histogram_tester;
+  EXPECT_FALSE(
+      io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE));
+  histogram_tester.ExpectUniqueSample(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE),
       1);
+}
 
-  net::TestNetworkQualityEstimator network_quality_estimator(params);
-  context.set_network_quality_estimator(&network_quality_estimator);
+TEST_F(PreviewsIODataTest, TestDisallowOfflineWhenNetworkQualityFast) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("ClientSidePreviews", "Enabled",
+                             {{"show_offline_pages", "true"},
+                              {"max_allowed_effective_connection_type", "2G"}});
 
-  // Set NQE type to unknown.
-  network_quality_estimator.set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
+  network_quality_estimator()->set_effective_connection_type(
+      net::EFFECTIVE_CONNECTION_TYPE_3G);
 
-  EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE));
-  histogram_tester.ExpectBucketCount(
-      "Previews.EligibilityReason.Offline",
-      static_cast<int>(PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE),
-      2);
-
-  // Set NQE type to fast enough.
-  network_quality_estimator.set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
-  EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE));
-  histogram_tester.ExpectBucketCount(
+  base::HistogramTester histogram_tester;
+  EXPECT_FALSE(
+      io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE));
+  histogram_tester.ExpectUniqueSample(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::NETWORK_NOT_SLOW), 1);
+}
 
-  // Set NQE type to slow.
-  network_quality_estimator.set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G);
+TEST_F(PreviewsIODataTest, TestDisallowOfflineOnReload) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("ClientSidePreviews", "Enabled",
+                             {{"show_offline_pages", "true"},
+                              {"max_allowed_effective_connection_type", "2G"}});
 
+  network_quality_estimator()->set_effective_connection_type(
+      net::EFFECTIVE_CONNECTION_TYPE_2G);
+
+  std::unique_ptr<net::URLRequest> request = CreateRequest();
   request->SetLoadFlags(net::LOAD_BYPASS_CACHE);
+
+  base::HistogramTester histogram_tester;
   EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE));
-  histogram_tester.ExpectBucketCount(
+  histogram_tester.ExpectUniqueSample(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(
           PreviewsEligibilityReason::RELOAD_DISALLOWED_FOR_OFFLINE),
       1);
+}
 
-  request->SetLoadFlags(0);
-  EXPECT_TRUE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE));
-  histogram_tester.ExpectBucketCount(
+TEST_F(PreviewsIODataTest, TestAllowOffline) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("ClientSidePreviews", "Enabled",
+                             {{"show_offline_pages", "true"},
+                              {"max_allowed_effective_connection_type", "2G"}});
+
+  network_quality_estimator()->set_effective_connection_type(
+      net::EFFECTIVE_CONNECTION_TYPE_2G);
+
+  base::HistogramTester histogram_tester;
+  EXPECT_TRUE(
+      io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE));
+  histogram_tester.ExpectUniqueSample(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1);
-
-  histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 8);
-
-  variations::testing::ClearAllVariationParams();
 }
 
+TEST_F(PreviewsIODataTest, ClientLoFiDisallowedByDefault) {
+  InitializeUIService();
+
+  base::HistogramTester histogram_tester;
+  EXPECT_FALSE(io_data()->ShouldAllowPreview(*CreateRequest(),
+                                             PreviewsType::CLIENT_LOFI));
+  histogram_tester.ExpectTotalCount("Previews.EligibilityReason.ClientLoFi", 0);
+}
+
+TEST_F(PreviewsIODataTest, ClientLoFiDisallowedWhenFieldTrialDisabled) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("PreviewsClientLoFi", "Disabled", {});
+
+  base::HistogramTester histogram_tester;
+  EXPECT_FALSE(io_data()->ShouldAllowPreview(*CreateRequest(),
+                                             PreviewsType::CLIENT_LOFI));
+  histogram_tester.ExpectTotalCount("Previews.EligibilityReason.ClientLoFi", 0);
+}
+
+TEST_F(PreviewsIODataTest, ClientLoFiDisallowedWhenNetworkQualityUnavailable) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("PreviewsClientLoFi", "Enabled", {});
+
+  network_quality_estimator()->set_effective_connection_type(
+      net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
+
+  base::HistogramTester histogram_tester;
+  EXPECT_FALSE(io_data()->ShouldAllowPreview(*CreateRequest(),
+                                             PreviewsType::CLIENT_LOFI));
+  histogram_tester.ExpectUniqueSample(
+      "Previews.EligibilityReason.ClientLoFi",
+      static_cast<int>(PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE),
+      1);
+}
+
+TEST_F(PreviewsIODataTest, ClientLoFiDisallowedWhenNetworkFast) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("PreviewsClientLoFi", "Enabled",
+                             {{"max_allowed_effective_connection_type", "2G"}});
+
+  network_quality_estimator()->set_effective_connection_type(
+      net::EFFECTIVE_CONNECTION_TYPE_3G);
+
+  base::HistogramTester histogram_tester;
+  EXPECT_FALSE(io_data()->ShouldAllowPreview(*CreateRequest(),
+                                             PreviewsType::CLIENT_LOFI));
+  histogram_tester.ExpectUniqueSample(
+      "Previews.EligibilityReason.ClientLoFi",
+      static_cast<int>(PreviewsEligibilityReason::NETWORK_NOT_SLOW), 1);
+}
+
+TEST_F(PreviewsIODataTest, ClientLoFiAllowed) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("PreviewsClientLoFi", "Enabled",
+                             {{"max_allowed_effective_connection_type", "2G"}});
+
+  network_quality_estimator()->set_effective_connection_type(
+      net::EFFECTIVE_CONNECTION_TYPE_2G);
+
+  base::HistogramTester histogram_tester;
+  EXPECT_TRUE(io_data()->ShouldAllowPreview(*CreateRequest(),
+                                            PreviewsType::CLIENT_LOFI));
+  histogram_tester.ExpectUniqueSample(
+      "Previews.EligibilityReason.ClientLoFi",
+      static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1);
+}
+
+TEST_F(PreviewsIODataTest, ClientLoFiAllowedOnReload) {
+  InitializeUIService();
+  CreateFieldTrialWithParams("PreviewsClientLoFi", "Enabled",
+                             {{"max_allowed_effective_connection_type", "2G"}});
+
+  network_quality_estimator()->set_effective_connection_type(
+      net::EFFECTIVE_CONNECTION_TYPE_2G);
+
+  std::unique_ptr<net::URLRequest> request = CreateRequest();
+  request->SetLoadFlags(net::LOAD_BYPASS_CACHE);
+
+  base::HistogramTester histogram_tester;
+  EXPECT_TRUE(
+      io_data()->ShouldAllowPreview(*request, PreviewsType::CLIENT_LOFI));
+  histogram_tester.ExpectUniqueSample(
+      "Previews.EligibilityReason.ClientLoFi",
+      static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1);
+}
+
+}  // namespace
+
 }  // namespace previews
diff --git a/components/safe_browsing/password_protection/BUILD.gn b/components/safe_browsing/password_protection/BUILD.gn
index d852f1c..ae64045 100644
--- a/components/safe_browsing/password_protection/BUILD.gn
+++ b/components/safe_browsing/password_protection/BUILD.gn
@@ -4,18 +4,26 @@
 
 source_set("password_protection") {
   sources = [
+    "password_protection_request.cc",
+    "password_protection_request.h",
     "password_protection_service.cc",
     "password_protection_service.h",
   ]
 
+  public_deps = [
+    "//google_apis:google_apis",
+  ]
+
   deps = [
     "//base:base",
     "//components/content_settings/core/browser:browser",
+    "//components/data_use_measurement/core:core",
     "//components/history/core/browser:browser",
     "//components/safe_browsing:csd_proto",
     "//components/safe_browsing_db:database_manager",
     "//components/safe_browsing_db:v4_protocol_manager_util",
     "//content/public/browser:browser",
+    "//net:net",
     "//third_party/protobuf:protobuf_lite",
   ]
 }
@@ -32,6 +40,7 @@
     "//components/safe_browsing_db:test_database_manager",
     "//components/sync_preferences:test_support",
     "//content/test:test_support",
+    "//net:test_support",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/protobuf:protobuf_lite",
diff --git a/components/safe_browsing/password_protection/DEPS b/components/safe_browsing/password_protection/DEPS
index 7887eb8..f04e7f6 100644
--- a/components/safe_browsing/password_protection/DEPS
+++ b/components/safe_browsing/password_protection/DEPS
@@ -7,5 +7,6 @@
   "+components/sync_preferences/testing_pref_service_syncable.h",
   "+content/public/browser",
   "+content/public/test",
+  "+net",
 ]
 
diff --git a/components/safe_browsing/password_protection/password_protection_request.cc b/components/safe_browsing/password_protection/password_protection_request.cc
new file mode 100644
index 0000000..4cef597c
--- /dev/null
+++ b/components/safe_browsing/password_protection/password_protection_request.cc
@@ -0,0 +1,209 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#include "components/safe_browsing/password_protection/password_protection_request.h"
+
+#include "base/memory/ptr_util.h"
+#include "base/memory/weak_ptr.h"
+#include "base/metrics/histogram_macros.h"
+#include "components/data_use_measurement/core/data_use_user_data.h"
+#include "content/public/browser/browser_thread.h"
+#include "net/base/escape.h"
+#include "net/base/load_flags.h"
+#include "net/base/url_util.h"
+#include "net/http/http_status_code.h"
+
+using content::BrowserThread;
+
+namespace safe_browsing {
+
+PasswordProtectionRequest::PasswordProtectionRequest(
+    const GURL& main_frame_url,
+    LoginReputationClientRequest::TriggerType type,
+    bool is_extended_reporting,
+    bool is_incognito,
+    base::WeakPtr<PasswordProtectionService> pps,
+    int request_timeout_in_ms)
+    : main_frame_url_(main_frame_url),
+      request_type_(type),
+      is_extended_reporting_(is_extended_reporting),
+      is_incognito_(is_incognito),
+      password_protection_service_(pps),
+      request_timeout_in_ms_(request_timeout_in_ms),
+      weakptr_factory_(this) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+}
+
+PasswordProtectionRequest::~PasswordProtectionRequest() {
+  weakptr_factory_.InvalidateWeakPtrs();
+}
+
+void PasswordProtectionRequest::Start() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  // Initially we only send ping for Safe Browsing Extended Reporting users when
+  // they are not in incognito mode. We may loose these conditions later.
+  if (is_incognito_) {
+    Finish(RequestOutcome::INCOGNITO, nullptr);
+    return;
+  }
+  if (!is_extended_reporting_) {
+    Finish(RequestOutcome::NO_EXTENDED_REPORTING, nullptr);
+    return;
+  }
+
+  CheckWhitelistsOnUIThread();
+}
+
+void PasswordProtectionRequest::CheckWhitelistsOnUIThread() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(password_protection_service_);
+
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(&PasswordProtectionService::CheckCsdWhitelistOnIOThread,
+                 password_protection_service_, main_frame_url_,
+                 base::Bind(&PasswordProtectionRequest::OnWhitelistCheckDone,
+                            GetWeakPtr())));
+}
+
+void PasswordProtectionRequest::OnWhitelistCheckDone(bool match_whitelist) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (match_whitelist)
+    Finish(RequestOutcome::MATCHED_WHITELIST, nullptr);
+  else
+    CheckCachedVerdicts();
+}
+
+void PasswordProtectionRequest::CheckCachedVerdicts() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (!password_protection_service_) {
+    Finish(RequestOutcome::SERVICE_DESTROYED, nullptr);
+    return;
+  }
+
+  std::unique_ptr<LoginReputationClientResponse> cached_response =
+      base::MakeUnique<LoginReputationClientResponse>();
+  auto verdict = password_protection_service_->GetCachedVerdict(
+      password_protection_service_->GetSettingMapForActiveProfile(),
+      main_frame_url_, cached_response.get());
+  if (verdict != LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED)
+    Finish(RequestOutcome::RESPONSE_ALREADY_CACHED, std::move(cached_response));
+  else
+    SendRequest();
+}
+
+void PasswordProtectionRequest::SendRequest() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  LoginReputationClientRequest request;
+  request.set_page_url(main_frame_url_.spec());
+  request.set_trigger_type(request_type_);
+  request.set_stored_verdict_cnt(
+      password_protection_service_->GetStoredVerdictCount());
+
+  std::string serialized_request;
+  if (!request.SerializeToString(&serialized_request)) {
+    Finish(RequestOutcome::REQUEST_MALFORMED, nullptr);
+    return;
+  }
+
+  // In case the request take too long, we set a timer to cancel this request.
+  StartTimeout();
+
+  fetcher_ = net::URLFetcher::Create(
+      0, PasswordProtectionService::GetPasswordProtectionRequestUrl(),
+      net::URLFetcher::POST, this);
+  data_use_measurement::DataUseUserData::AttachToFetcher(
+      fetcher_.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING);
+  fetcher_->SetLoadFlags(net::LOAD_DISABLE_CACHE);
+  fetcher_->SetAutomaticallyRetryOn5xx(false);
+  fetcher_->SetRequestContext(
+      password_protection_service_->request_context_getter().get());
+  fetcher_->SetUploadData("application/octet-stream", serialized_request);
+  request_start_time_ = base::TimeTicks::Now();
+  fetcher_->Start();
+}
+
+void PasswordProtectionRequest::StartTimeout() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  // If request is not done withing 10 seconds, we cancel this request.
+  // The weak pointer used for the timeout will be invalidated (and
+  // hence would prevent the timeout) if the check completes on time and
+  // execution reaches Finish().
+  BrowserThread::PostDelayedTask(
+      BrowserThread::UI, FROM_HERE,
+      base::Bind(&PasswordProtectionRequest::Cancel, GetWeakPtr(), true),
+      base::TimeDelta::FromMilliseconds(request_timeout_in_ms_));
+}
+
+void PasswordProtectionRequest::OnURLFetchComplete(
+    const net::URLFetcher* source) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  net::URLRequestStatus status = source->GetStatus();
+  const bool is_success = status.is_success();
+  const int response_code = source->GetResponseCode();
+
+  UMA_HISTOGRAM_SPARSE_SLOWLY(
+      "PasswordProtection.PasswordProtectionResponseOrErrorCode",
+      is_success ? response_code : status.error());
+
+  if (!is_success || net::HTTP_OK != response_code) {
+    Finish(RequestOutcome::FETCH_FAILED, nullptr);
+    return;
+  }
+
+  std::unique_ptr<LoginReputationClientResponse> response =
+      base::MakeUnique<LoginReputationClientResponse>();
+  std::string response_body;
+  bool received_data = source->GetResponseAsString(&response_body);
+  DCHECK(received_data);
+  fetcher_.reset();  // We don't need it anymore.
+  UMA_HISTOGRAM_TIMES("PasswordProtection.RequestNetworkDuration",
+                      base::TimeTicks::Now() - request_start_time_);
+  if (response->ParseFromString(response_body)) {
+    Finish(RequestOutcome::SUCCEEDED, std::move(response));
+  } else {
+    Finish(RequestOutcome::RESPONSE_MALFORMED, nullptr);
+  }
+}
+
+void PasswordProtectionRequest::Finish(
+    RequestOutcome outcome,
+    std::unique_ptr<LoginReputationClientResponse> response) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  UMA_HISTOGRAM_ENUMERATION("PasswordProtection.RequestOutcome", outcome,
+                            RequestOutcome::MAX_OUTCOME);
+
+  if (response) {
+    switch (request_type_) {
+      case LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE:
+        UMA_HISTOGRAM_ENUMERATION(
+            "PasswordProtection.UnfamiliarLoginPageVerdict",
+            response->verdict_type(),
+            LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
+        break;
+      case LoginReputationClientRequest::PASSWORD_REUSE_EVENT:
+        UMA_HISTOGRAM_ENUMERATION(
+            "PasswordProtection.PasswordReuseEventVerdict",
+            response->verdict_type(),
+            LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
+        break;
+      default:
+        NOTREACHED();
+    }
+  }
+
+  DCHECK(password_protection_service_);
+  password_protection_service_->RequestFinished(this, std::move(response));
+}
+
+void PasswordProtectionRequest::Cancel(bool timed_out) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  fetcher_.reset();
+
+  Finish(timed_out ? TIMEDOUT : CANCELED, nullptr);
+}
+
+}  // namespace safe_browsing
diff --git a/components/safe_browsing/password_protection/password_protection_request.h b/components/safe_browsing/password_protection/password_protection_request.h
new file mode 100644
index 0000000..7e206d53
--- /dev/null
+++ b/components/safe_browsing/password_protection/password_protection_request.h
@@ -0,0 +1,123 @@
+// 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 COMPONENTS_SAFE_BROWSING_PASSWORD_PROTECTION_PASSWORD_PROTECTION_REQUEST_H_
+#define COMPONENTS_SAFE_BROWSING_PASSWORD_PROTECTION_PASSWORD_PROTECTION_REQUEST_H_
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "components/safe_browsing/password_protection/password_protection_service.h"
+#include "net/url_request/url_fetcher.h"
+#include "net/url_request/url_fetcher_delegate.h"
+#include "net/url_request/url_request_status.h"
+
+class GURL;
+
+namespace safe_browsing {
+
+// A request for checking if an unfamiliar login form or a password reuse event
+// is safe. PasswordProtectionRequest objects are owned by
+// PasswordProtectionService indicated by |password_protection_service_|.
+class PasswordProtectionRequest : public net::URLFetcherDelegate {
+ public:
+  // The outcome of the request. These values are used for UMA.
+  // DO NOT CHANGE THE ORDERING OF THESE VALUES.
+  enum RequestOutcome {
+    UNKNOWN = 0,
+    SUCCEEDED = 1,
+    CANCELED = 2,
+    TIMEDOUT = 3,
+    MATCHED_WHITELIST = 4,
+    RESPONSE_ALREADY_CACHED = 5,
+    NO_EXTENDED_REPORTING = 6,
+    INCOGNITO = 7,
+    REQUEST_MALFORMED = 8,
+    FETCH_FAILED = 9,
+    RESPONSE_MALFORMED = 10,
+    SERVICE_DESTROYED = 11,
+    MAX_OUTCOME
+  };
+
+  PasswordProtectionRequest(const GURL& main_frame_url,
+                            LoginReputationClientRequest::TriggerType type,
+                            bool is_extended_reporting,
+                            bool is_incognito,
+                            base::WeakPtr<PasswordProtectionService> pps,
+                            int request_timeout_in_ms);
+
+  ~PasswordProtectionRequest() override;
+
+  base::WeakPtr<PasswordProtectionRequest> GetWeakPtr() {
+    return weakptr_factory_.GetWeakPtr();
+  }
+
+  // Starts processing request by checking extended reporting and incognito
+  // conditions.
+  void Start();
+
+  // Cancels the current request. |timed_out| indicates if this cancellation is
+  // due to timeout. This function will call Finish() to destroy |this|.
+  void Cancel(bool timed_out);
+
+  // net::URLFetcherDelegate override.
+  // Processes the received response.
+  void OnURLFetchComplete(const net::URLFetcher* source) override;
+
+  GURL main_frame_url() const { return main_frame_url_; }
+
+  bool is_incognito() const { return is_incognito_; }
+
+ private:
+  // If |main_frame_url_| matches whitelist, call Finish() immediately;
+  // otherwise call CheckCachedVerdicts().
+  void OnWhitelistCheckDone(bool match_whitelist);
+
+  // Looks up cached verdicts. If verdict is already cached, call SendRequest();
+  // otherwise call Finish().
+  void CheckCachedVerdicts();
+
+  // Initiates network request to Safe Browsing backend.
+  void SendRequest();
+
+  // Start a timer to cancel the request if it takes too long.
+  void StartTimeout();
+
+  // |this| will be destroyed after calling this function.
+  void Finish(RequestOutcome outcome,
+              std::unique_ptr<LoginReputationClientResponse> response);
+
+  void CheckWhitelistsOnUIThread();
+
+  // Main frame URL of the login form.
+  GURL main_frame_url_;
+
+  // If this request is for unfamiliar login page or for a password reuse event.
+  const LoginReputationClientRequest::TriggerType request_type_;
+
+  // If user is opted-in Safe Browsing Extended Reporting.
+  const bool is_extended_reporting_;
+
+  // If current session is in incognito mode.
+  const bool is_incognito_;
+
+  // When request is sent.
+  base::TimeTicks request_start_time_;
+
+  // URLFetcher instance for sending request and receiving response.
+  std::unique_ptr<net::URLFetcher> fetcher_;
+
+  // The PasswordProtectionService instance owns |this|.
+  base::WeakPtr<PasswordProtectionService> password_protection_service_;
+
+  // If we haven't receive response after this period of time, we cancel this
+  // request.
+  const int request_timeout_in_ms_;
+
+  base::WeakPtrFactory<PasswordProtectionRequest> weakptr_factory_;
+  DISALLOW_COPY_AND_ASSIGN(PasswordProtectionRequest);
+};
+
+}  // namespace safe_browsing
+
+#endif  // COMPONENTS_SAFE_BROWSING_PASSWORD_PROTECTION_PASSWORD_PROTECTION_REQUEST_H_
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc
index e8f348e5..47bdeb4 100644
--- a/components/safe_browsing/password_protection/password_protection_service.cc
+++ b/components/safe_browsing/password_protection/password_protection_service.cc
@@ -11,9 +11,12 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
+#include "components/safe_browsing/password_protection/password_protection_request.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "components/safe_browsing_db/v4_protocol_manager_util.h"
 #include "content/public/browser/browser_thread.h"
+#include "google_apis/google_api_keys.h"
+#include "net/base/escape.h"
 
 using content::BrowserThread;
 
@@ -22,8 +25,11 @@
 namespace {
 
 // Keys for storing password protection verdict into a DictionaryValue.
-static const char kCacheCreationTime[] = "cache_creation_time";
-static const char kVerdictProto[] = "verdict_proto";
+const char kCacheCreationTime[] = "cache_creation_time";
+const char kVerdictProto[] = "verdict_proto";
+const int kRequestTimeoutMs = 10000;
+const char kPasswordProtectionRequestUrl[] =
+    "https://sb-ssl.google.com/safebrowsing/clientreport/login";
 
 // Helper function to determine if the given origin matches content settings
 // map's patterns.
@@ -55,12 +61,16 @@
 }  // namespace
 
 PasswordProtectionService::PasswordProtectionService(
-    const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager)
-    : database_manager_(database_manager), weak_factory_(this) {
+    const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager,
+    scoped_refptr<net::URLRequestContextGetter> request_context_getter)
+    : request_context_getter_(request_context_getter),
+      database_manager_(database_manager),
+      weak_factory_(this) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 }
 
 PasswordProtectionService::~PasswordProtectionService() {
+  CancelPendingRequests();
   weak_factory_.InvalidateWeakPtrs();
 }
 
@@ -70,20 +80,31 @@
   if (!url.is_valid())
     return;
 
-  BrowserThread::PostTaskAndReplyWithResult(
+  BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
-      base::Bind(&SafeBrowsingDatabaseManager::MatchCsdWhitelistUrl,
-                 database_manager_, url),
-      base::Bind(&PasswordProtectionService::OnMatchCsdWhiteListResult,
-                 GetWeakPtr()));
+      base::Bind(
+          &PasswordProtectionService::CheckCsdWhitelistOnIOThread, GetWeakPtr(),
+          url,
+          base::Bind(&PasswordProtectionService::OnMatchCsdWhiteListResult,
+                     GetWeakPtr())));
+}
+
+void PasswordProtectionService::CheckCsdWhitelistOnIOThread(
+    const GURL& url,
+    const CheckCsdWhitelistCallback& callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DCHECK(database_manager_);
+  bool check_result = database_manager_->MatchCsdWhitelistUrl(url);
+  DCHECK(callback);
+  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+                          base::Bind(callback, check_result));
 }
 
 LoginReputationClientResponse::VerdictType
 PasswordProtectionService::GetCachedVerdict(
     const HostContentSettingsMap* settings,
-    const GURL& url) {
-  // TODO(jialiul): Add UMA metrics to track if verdict is available, not
-  // available, or expired.
+    const GURL& url,
+    LoginReputationClientResponse* out_response) {
   DCHECK(settings);
   if (!url.is_valid()) {
     return LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED;
@@ -95,9 +116,8 @@
           hostname, GURL(), CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION,
           std::string(), nullptr));
   // Return early if there is no verdict cached for this origin.
-  if (!verdict_dictionary.get() || verdict_dictionary->empty()) {
+  if (!verdict_dictionary.get() || verdict_dictionary->empty())
     return LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED;
-  }
 
   std::vector<std::string> paths;
   GeneratePathVariantsWithoutQuery(url, &paths);
@@ -122,13 +142,16 @@
 
     if (verdict.cache_expression_exact_match()) {
       if (PathMatchCacheExpressionExactly(paths, cache_expression_path)) {
-        return IsCacheExpired(verdict_received_time,
-                              verdict.cache_duration_sec())
-                   ? LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED
-                   : verdict.verdict_type();
+        if (!IsCacheExpired(verdict_received_time,
+                            verdict.cache_duration_sec())) {
+          out_response->CopyFrom(verdict);
+          return verdict.verdict_type();
+        } else {  // verdict expired
+          return LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED;
+        }
       }
     } else {
-      // If it doesn't require exact match, we need to fine the most specific
+      // If it doesn't require exact match, we need to find the most specific
       // match.
       size_t path_depth = GetPathDepth(cache_expression_path);
       if (path_depth > max_path_depth &&
@@ -137,6 +160,7 @@
                           verdict.cache_duration_sec())) {
         max_path_depth = path_depth;
         most_matching_verdict = verdict.verdict_type();
+        out_response->CopyFrom(verdict);
       }
     }
   }
@@ -161,6 +185,11 @@
 
   std::unique_ptr<base::DictionaryValue> verdict_entry =
       CreateDictionaryFromVerdict(verdict, receive_time);
+
+  // Increases stored verdict count if we haven't seen this cache expression
+  // before.
+  if (!verdict_dictionary->HasKey(verdict->cache_expression()))
+    stored_verdict_counts_[settings] = GetStoredVerdictCount() + 1U;
   // If same cache_expression is already in this verdict_dictionary, we simply
   // override it.
   verdict_dictionary->SetWithoutPathExpansion(verdict->cache_expression(),
@@ -170,9 +199,94 @@
       std::string(), std::move(verdict_dictionary));
 }
 
+void PasswordProtectionService::StartRequest(
+    const GURL& main_frame_url,
+    LoginReputationClientRequest::TriggerType type,
+    bool is_extended_reporting,
+    bool is_incognito) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  std::unique_ptr<PasswordProtectionRequest> request =
+      base::MakeUnique<PasswordProtectionRequest>(
+          main_frame_url, type, is_extended_reporting, is_incognito,
+          GetWeakPtr(), GetRequestTimeoutInMS());
+  DCHECK(request);
+  request->Start();
+  requests_.insert(std::move(request));
+}
+
+void PasswordProtectionService::RequestFinished(
+    PasswordProtectionRequest* request,
+    std::unique_ptr<LoginReputationClientResponse> response) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  DCHECK(request);
+  // TODO(jialiul): We don't cache verdict for incognito mode for now.
+  // Later we may consider temporarily caching verdict.
+  if (!request->is_incognito() && response) {
+    CacheVerdict(request->main_frame_url(), response.get(), base::Time::Now(),
+                 GetSettingMapForActiveProfile());
+  }
+  // Finished processing this request. Remove it from pending list.
+  for (auto it = requests_.begin(); it != requests_.end(); it++) {
+    if (it->get() == request) {
+      requests_.erase(it);
+      break;
+    }
+  }
+}
+
+void PasswordProtectionService::CancelPendingRequests() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  for (auto it = requests_.begin(); it != requests_.end();) {
+    // We need to advance the iterator before we cancel because canceling
+    // the request will invalidate it when RequestFinished is called.
+    PasswordProtectionRequest* request = it->get();
+    it++;
+    request->Cancel(false);
+  }
+  DCHECK(requests_.empty());
+}
+
+GURL PasswordProtectionService::GetPasswordProtectionRequestUrl() {
+  GURL url(kPasswordProtectionRequestUrl);
+  std::string api_key = google_apis::GetAPIKey();
+  DCHECK(!api_key.empty());
+  return url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true));
+}
+
+size_t PasswordProtectionService::GetStoredVerdictCount() {
+  HostContentSettingsMap* content_setting_map = GetSettingMapForActiveProfile();
+  DCHECK(content_setting_map);
+  auto it = stored_verdict_counts_.find(content_setting_map);
+  // If we have already computed this, return its value.
+  if (it != stored_verdict_counts_.end())
+    return it->second;
+
+  ContentSettingsForOneType password_protection_settings;
+  content_setting_map->GetSettingsForOneType(
+      CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION, std::string(),
+      &password_protection_settings);
+  stored_verdict_counts_[content_setting_map] = 0U;
+  if (password_protection_settings.empty())
+    return 0U;
+
+  for (const ContentSettingPatternSource& source :
+       password_protection_settings) {
+    std::unique_ptr<base::DictionaryValue> verdict_dictionary =
+        base::DictionaryValue::From(content_setting_map->GetWebsiteSetting(
+            GURL(source.primary_pattern.ToString()), GURL(),
+            CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION, std::string(), nullptr));
+    stored_verdict_counts_[content_setting_map] += verdict_dictionary->size();
+  }
+  return stored_verdict_counts_[content_setting_map];
+}
+
+int PasswordProtectionService::GetRequestTimeoutInMS() {
+  return kRequestTimeoutMs;
+}
+
 void PasswordProtectionService::OnMatchCsdWhiteListResult(
     bool match_whitelist) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   UMA_HISTOGRAM_BOOLEAN(
       "PasswordManager.PasswordReuse.MainFrameMatchCsdWhitelist",
       match_whitelist);
@@ -209,6 +323,7 @@
   if (all_history) {
     setting_map->ClearSettingsForOneType(
         CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION);
+    stored_verdict_counts_[setting_map] = 0U;
     return;
   }
 
@@ -217,9 +332,17 @@
   // We might revisit this logic later to decide if we want to only delete the
   // cached verdict whose cache expression matches this URL.
   for (const history::URLRow& row : deleted_rows) {
+    GURL url_key = GetHostNameWithHTTPScheme(row.url());
+    std::unique_ptr<base::DictionaryValue> verdict_dictionary =
+        base::DictionaryValue::From(setting_map->GetWebsiteSetting(
+            url_key, GURL(), CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION,
+            std::string(), nullptr));
+    size_t verdict_count = verdict_dictionary->size();
+    stored_verdict_counts_[setting_map] =
+        GetStoredVerdictCount() - verdict_count;
     setting_map->ClearSettingsForOneTypeWithPredicate(
         CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION,
-        base::Bind(&OriginMatchPrimaryPattern, row.url().GetOrigin()));
+        base::Bind(&OriginMatchPrimaryPattern, url_key));
   }
 }
 
diff --git a/components/safe_browsing/password_protection/password_protection_service.h b/components/safe_browsing/password_protection/password_protection_service.h
index 351c5ef0..92db762 100644
--- a/components/safe_browsing/password_protection/password_protection_service.h
+++ b/components/safe_browsing/password_protection/password_protection_service.h
@@ -5,6 +5,9 @@
 #ifndef COMPONENTS_SAFE_BROWSING_PASSWORD_PROTECTION_PASSWORD_PROTECTION_SERVICE_H_
 #define COMPONENTS_SAFE_BROWSING_PASSWORD_PROTECTION_PASSWORD_PROTECTION_SERVICE_H_
 
+#include <unordered_set>
+
+#include "base/callback.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
@@ -13,6 +16,7 @@
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/history/core/browser/history_service_observer.h"
 #include "components/safe_browsing/csd.pb.h"
+#include "net/url_request/url_request_context_getter.h"
 
 namespace history {
 class HistoryService;
@@ -23,11 +27,15 @@
 namespace safe_browsing {
 
 class SafeBrowsingDatabaseManager;
+class PasswordProtectionRequest;
 
 class PasswordProtectionService : history::HistoryServiceObserver {
  public:
-  explicit PasswordProtectionService(
-      const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager);
+  using CheckCsdWhitelistCallback = base::Callback<void(bool)>;
+
+  PasswordProtectionService(
+      const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager,
+      scoped_refptr<net::URLRequestContextGetter> request_context_getter);
 
   ~PasswordProtectionService() override;
 
@@ -35,16 +43,20 @@
   // Currently called by PasswordReuseDetectionManager on UI thread.
   void RecordPasswordReuse(const GURL& url);
 
+  void CheckCsdWhitelistOnIOThread(const GURL& url,
+                                   const CheckCsdWhitelistCallback& callback);
+
   base::WeakPtr<PasswordProtectionService> GetWeakPtr() {
     return weak_factory_.GetWeakPtr();
   }
 
-  // Looks up |settings|, and returns the verdict of |url|. Can be called on any
-  // thread. If verdict is not available or is expired, return
-  // VERDICT_TYPE_UNSPECIFIED.
+  // Looks up |settings| to find the cached verdict response. If verdict is not
+  // available or is expired, return VERDICT_TYPE_UNSPECIFIED. Can be called on
+  // any thread.
   LoginReputationClientResponse::VerdictType GetCachedVerdict(
       const HostContentSettingsMap* settings,
-      const GURL& url);
+      const GURL& url,
+      LoginReputationClientResponse* out_response);
 
   // Stores |verdict| in |settings| based on |url|, |verdict| and
   // |receive_time|.
@@ -53,8 +65,41 @@
                     const base::Time& receive_time,
                     HostContentSettingsMap* settings);
 
+  // Creates an instance of PasswordProtectionRequest and call Start() on that
+  // instance. This function also insert this request object in |requests_| for
+  // record keeping.
+  void StartRequest(const GURL& main_frame_url,
+                    LoginReputationClientRequest::TriggerType type,
+                    bool is_extended_reporting,
+                    bool is_incognito);
+
+  // Called by a PasswordProtectionRequest instance when it finishes to remove
+  // itself from |requests_|.
+  virtual void RequestFinished(
+      PasswordProtectionRequest* request,
+      std::unique_ptr<LoginReputationClientResponse> response);
+
+  // Cancels all requests in |requests_|, empties it, and releases references to
+  // the requests.
+  void CancelPendingRequests();
+
+  // Gets the total number of verdict (no matter expired or not) we cached for
+  // current active profile.
+  virtual size_t GetStoredVerdictCount();
+
+  scoped_refptr<net::URLRequestContextGetter> request_context_getter() {
+    return request_context_getter_;
+  }
+
+  // Returns the URL where PasswordProtectionRequest instances send requests.
+  static GURL GetPasswordProtectionRequestUrl();
+
+  // Gets the request timeout in milliseconds.
+  static int GetRequestTimeoutInMS();
+
  protected:
-  // Called on UI thread.
+  friend class PasswordProtectionRequest;
+
   // Increases "PasswordManager.PasswordReuse.MainFrameMatchCsdWhitelist" UMA
   // metric based on input.
   void OnMatchCsdWhiteListResult(bool match_whitelist);
@@ -114,6 +159,17 @@
       const LoginReputationClientResponse* verdict,
       const base::Time& receive_time);
 
+  // Stored verdict count for each HostContentSettingsMap.
+  std::unordered_map<HostContentSettingsMap*, size_t> stored_verdict_counts_;
+
+  // The context we use to issue network requests. This request_context_getter
+  // is obtained from SafeBrowsingService so that we can use the Safe Browsing
+  // cookie store.
+  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
+
+  // Set of pending PasswordProtectionRequests.
+  std::unordered_set<std::unique_ptr<PasswordProtectionRequest>> requests_;
+
   scoped_refptr<SafeBrowsingDatabaseManager> database_manager_;
   base::WeakPtrFactory<PasswordProtectionService> weak_factory_;
   DISALLOW_COPY_AND_ASSIGN(PasswordProtectionService);
diff --git a/components/safe_browsing/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/password_protection/password_protection_service_unittest.cc
index e94d47c..04c0d0f7 100644
--- a/components/safe_browsing/password_protection/password_protection_service_unittest.cc
+++ b/components/safe_browsing/password_protection/password_protection_service_unittest.cc
@@ -7,9 +7,12 @@
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/test/histogram_tester.h"
+#include "base/test/null_task_runner.h"
+#include "components/safe_browsing/password_protection/password_protection_request.h"
 #include "components/safe_browsing_db/test_database_manager.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "net/url_request/test_url_fetcher_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -19,6 +22,8 @@
     "PasswordManager.PasswordReuse.MainFrameMatchCsdWhitelist";
 const char kWhitelistedUrl[] = "http://inwhitelist.com";
 const char kNoneWhitelistedUrl[] = "http://notinwhitelist.com";
+const char kRequestOutcomeHistogramName[] = "PasswordProtection.RequestOutcome";
+const char kTargetUrl[] = "http://foo.com";
 
 }  // namespace
 
@@ -37,14 +42,57 @@
   DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingDatabaseManager);
 };
 
+class DummyURLRequestContextGetter : public net::URLRequestContextGetter {
+ public:
+  DummyURLRequestContextGetter()
+      : dummy_task_runner_(new base::NullTaskRunner) {}
+
+  net::URLRequestContext* GetURLRequestContext() override { return nullptr; }
+
+  scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
+      const override {
+    return dummy_task_runner_;
+  }
+
+ private:
+  ~DummyURLRequestContextGetter() override {}
+
+  scoped_refptr<base::SingleThreadTaskRunner> dummy_task_runner_;
+};
+
+class TestPasswordProtectionService : public PasswordProtectionService {
+ public:
+  TestPasswordProtectionService(
+      const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager,
+      scoped_refptr<net::URLRequestContextGetter> request_context_getter,
+      scoped_refptr<HostContentSettingsMap> content_setting_map)
+      : PasswordProtectionService(database_manager, request_context_getter),
+        content_setting_map_(content_setting_map) {}
+
+  HostContentSettingsMap* GetSettingMapForActiveProfile() override {
+    return content_setting_map_.get();
+  }
+
+  void RequestFinished(
+      PasswordProtectionRequest* request,
+      std::unique_ptr<LoginReputationClientResponse> response) override {
+    latest_response_ = std::move(response);
+  }
+
+  LoginReputationClientResponse* latest_response() {
+    return latest_response_.get();
+  }
+
+ private:
+  std::unique_ptr<LoginReputationClientResponse> latest_response_;
+  scoped_refptr<HostContentSettingsMap> content_setting_map_;
+  DISALLOW_COPY_AND_ASSIGN(TestPasswordProtectionService);
+};
+
 class PasswordProtectionServiceTest : public testing::Test {
  public:
   PasswordProtectionServiceTest(){};
 
-  ~PasswordProtectionServiceTest() override {
-    content_setting_map_->ShutdownOnUIThread();
-  }
-
   LoginReputationClientResponse CreateVerdictProto(
       LoginReputationClientResponse::VerdictType verdict,
       int cache_duration_sec,
@@ -59,12 +107,33 @@
   }
 
   void SetUp() override {
-    database_manager_ = new MockSafeBrowsingDatabaseManager();
-    password_protection_service_ =
-        base::MakeUnique<PasswordProtectionService>(database_manager_);
     HostContentSettingsMap::RegisterProfilePrefs(test_pref_service_.registry());
     content_setting_map_ = new HostContentSettingsMap(
         &test_pref_service_, false /* incognito */, false /* guest_profile */);
+    database_manager_ = new MockSafeBrowsingDatabaseManager();
+    dummy_request_context_getter_ = new DummyURLRequestContextGetter();
+    password_protection_service_ =
+        base::MakeUnique<TestPasswordProtectionService>(
+            database_manager_, dummy_request_context_getter_,
+            content_setting_map_);
+  }
+
+  void TearDown() override { content_setting_map_->ShutdownOnUIThread(); }
+
+  // Sets up |database_manager_| and |requests_| as needed.
+  void InitializeAndStartRequest(bool is_extended_reporting,
+                                 bool incognito,
+                                 bool match_whitelist,
+                                 int timeout_in_ms) {
+    GURL target_url(kTargetUrl);
+    EXPECT_CALL(*database_manager_.get(), MatchCsdWhitelistUrl(target_url))
+        .WillRepeatedly(testing::Return(match_whitelist));
+
+    request_ = base::MakeUnique<PasswordProtectionRequest>(
+        target_url, LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE,
+        is_extended_reporting, incognito,
+        password_protection_service_->GetWeakPtr(), timeout_in_ms);
+    request_->Start();
   }
 
   bool PathVariantsMatchCacheExpression(const GURL& url,
@@ -97,20 +166,8 @@
         url, &response, verdict_received_time, content_setting_map_.get());
   }
 
-  size_t GetPasswordProtectionSettingCount() {
-    ContentSettingsForOneType password_protection_settings;
-    content_setting_map_->GetSettingsForOneType(
-        CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION, std::string(),
-        &password_protection_settings);
-    return password_protection_settings.size();
-  }
-
-  size_t GetVerdictCountForOrigin(const GURL& origin_url) {
-    std::unique_ptr<base::DictionaryValue> verdict_dictionary =
-        base::DictionaryValue::From(content_setting_map_->GetWebsiteSetting(
-            origin_url, GURL(), CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION,
-            std::string(), nullptr));
-    return verdict_dictionary->size();
+  size_t GetStoredVerdictCount() {
+    return password_protection_service_->GetStoredVerdictCount();
   }
 
  protected:
@@ -118,9 +175,12 @@
   // threads.
   content::TestBrowserThreadBundle thread_bundle_;
   scoped_refptr<MockSafeBrowsingDatabaseManager> database_manager_;
-  std::unique_ptr<PasswordProtectionService> password_protection_service_;
   sync_preferences::TestingPrefServiceSyncable test_pref_service_;
   scoped_refptr<HostContentSettingsMap> content_setting_map_;
+  scoped_refptr<DummyURLRequestContextGetter> dummy_request_context_getter_;
+  std::unique_ptr<TestPasswordProtectionService> password_protection_service_;
+  std::unique_ptr<PasswordProtectionRequest> request_;
+  base::HistogramTester histograms_;
 };
 
 TEST_F(PasswordProtectionServiceTest,
@@ -132,26 +192,25 @@
   EXPECT_CALL(*database_manager_.get(),
               MatchCsdWhitelistUrl(not_whitelisted_url))
       .WillOnce(testing::Return(false));
-  base::HistogramTester histograms;
-  histograms.ExpectTotalCount(kPasswordReuseMatchWhitelistHistogramName, 0);
+  histograms_.ExpectTotalCount(kPasswordReuseMatchWhitelistHistogramName, 0);
 
   // Empty url should not increment metric.
   password_protection_service_->RecordPasswordReuse(GURL());
   base::RunLoop().RunUntilIdle();
-  histograms.ExpectTotalCount(kPasswordReuseMatchWhitelistHistogramName, 0);
+  histograms_.ExpectTotalCount(kPasswordReuseMatchWhitelistHistogramName, 0);
 
   // Whitelisted url should increase "True" bucket by 1.
   password_protection_service_->RecordPasswordReuse(whitelisted_url);
   base::RunLoop().RunUntilIdle();
   EXPECT_THAT(
-      histograms.GetAllSamples(kPasswordReuseMatchWhitelistHistogramName),
+      histograms_.GetAllSamples(kPasswordReuseMatchWhitelistHistogramName),
       testing::ElementsAre(base::Bucket(1, 1)));
 
   // Non-whitelisted url should increase "False" bucket by 1.
   password_protection_service_->RecordPasswordReuse(not_whitelisted_url);
   base::RunLoop().RunUntilIdle();
   EXPECT_THAT(
-      histograms.GetAllSamples(kPasswordReuseMatchWhitelistHistogramName),
+      histograms_.GetAllSamples(kPasswordReuseMatchWhitelistHistogramName),
       testing::ElementsAre(base::Bucket(0, 1), base::Bucket(1, 1)));
 }
 
@@ -264,29 +323,26 @@
 }
 
 TEST_F(PasswordProtectionServiceTest, TestCachedVerdicts) {
-  ASSERT_EQ(0U, GetPasswordProtectionSettingCount());
+  ASSERT_EQ(0U, GetStoredVerdictCount());
   // Assume each verdict has a TTL of 10 minutes.
   // Cache a verdict for http://www.test.com/foo/index.html
   CacheVerdict(GURL("http://www.test.com/foo/index.html"),
                LoginReputationClientResponse::SAFE, 10 * 60, "test.com/foo",
                false, base::Time::Now());
 
-  EXPECT_EQ(1U, GetPasswordProtectionSettingCount());
-  EXPECT_EQ(1U, GetVerdictCountForOrigin(
-                    GURL("http://www.test.com/foo/index.html").GetOrigin()));
+  EXPECT_EQ(1U, GetStoredVerdictCount());
 
   // Cache another verdict with the some origin and cache_expression should
   // override the cache.
   CacheVerdict(GURL("http://www.test.com/foo/index2.html"),
                LoginReputationClientResponse::PHISHING, 10 * 60, "test.com/foo",
                false, base::Time::Now());
-  EXPECT_EQ(1U, GetPasswordProtectionSettingCount());
-  EXPECT_EQ(1U,
-            GetVerdictCountForOrigin(GURL("http://www.test.com/").GetOrigin()));
+  EXPECT_EQ(1U, GetStoredVerdictCount());
+  LoginReputationClientResponse out_verdict;
   EXPECT_EQ(LoginReputationClientResponse::PHISHING,
             password_protection_service_->GetCachedVerdict(
                 content_setting_map_.get(),
-                GURL("http://www.test.com/foo/index2.html")));
+                GURL("http://www.test.com/foo/index2.html"), &out_verdict));
 
   // Cache another verdict with the same origin but different cache_expression
   // will not increase setting count, but will increase the number of verdicts
@@ -294,13 +350,11 @@
   CacheVerdict(GURL("http://www.test.com/bar/index2.html"),
                LoginReputationClientResponse::SAFE, 10 * 60, "test.com/bar",
                false, base::Time::Now());
-  EXPECT_EQ(1U, GetPasswordProtectionSettingCount());
-  EXPECT_EQ(2U,
-            GetVerdictCountForOrigin(GURL("http://www.test.com/").GetOrigin()));
+  EXPECT_EQ(2U, GetStoredVerdictCount());
 }
 
 TEST_F(PasswordProtectionServiceTest, TestGetCachedVerdicts) {
-  ASSERT_EQ(0U, GetPasswordProtectionSettingCount());
+  ASSERT_EQ(0U, GetStoredVerdictCount());
   // Prepare 3 verdicts of the same origin with different cache expressions:
   // (1) require exact match, not expired.
   // (2) not require exact match, not expired.
@@ -317,56 +371,59 @@
       LoginReputationClientResponse::PHISHING, 10 * 60, "test.com/def", false,
       base::Time::FromDoubleT(now.ToDoubleT() -
                               24.0 * 60.0 * 60.0));  // Yesterday, expired.
-  ASSERT_EQ(1U, GetPasswordProtectionSettingCount());
+  ASSERT_EQ(3U, GetStoredVerdictCount());
 
   // Return VERDICT_TYPE_UNSPECIFIED if look up for a URL with unknown origin.
+  LoginReputationClientResponse actual_verdict;
   EXPECT_EQ(LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED,
             password_protection_service_->GetCachedVerdict(
-                content_setting_map_.get(), GURL("http://www.unknown.com/")));
+                content_setting_map_.get(), GURL("http://www.unknown.com/"),
+                &actual_verdict));
 
   // Return VERDICT_TYPE_UNSPECIFIED if look up for a URL with http://test.com
   // origin, but doesn't match any known cache_expression.
-  EXPECT_EQ(
-      LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED,
-      password_protection_service_->GetCachedVerdict(
-          content_setting_map_.get(), GURL("http://test.com/xyz/foo.jsp")));
+  EXPECT_EQ(LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED,
+            password_protection_service_->GetCachedVerdict(
+                content_setting_map_.get(), GURL("http://test.com/xyz/foo.jsp"),
+                &actual_verdict));
 
   // Return VERDICT_TYPE_UNSPECIFIED if look up for a URL whose variants match
   // test.com/def, since corresponding entry is expired.
   EXPECT_EQ(LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED,
             password_protection_service_->GetCachedVerdict(
                 content_setting_map_.get(),
-                GURL("http://test.com/def/ghi/index.html")));
+                GURL("http://test.com/def/ghi/index.html"), &actual_verdict));
 
   // Return VERDICT_TYPE_UNSPECIFIED if look up for a URL whose variants match
   // test.com, but not match it exactly. Return SAFE if it is a exact match of
   // test.com.
-  EXPECT_EQ(
-      LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED,
-      password_protection_service_->GetCachedVerdict(
-          content_setting_map_.get(), GURL("http://test.com/ghi/index.html")));
+  EXPECT_EQ(LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED,
+            password_protection_service_->GetCachedVerdict(
+                content_setting_map_.get(),
+                GURL("http://test.com/ghi/index.html"), &actual_verdict));
   EXPECT_EQ(LoginReputationClientResponse::SAFE,
             password_protection_service_->GetCachedVerdict(
                 content_setting_map_.get(),
-                GURL("http://test.com/term_of_service.html")));
+                GURL("http://test.com/term_of_service.html"), &actual_verdict));
 
   // Return LOW_REPUTATION if look up for a URL whose variants match
   // test.com/abc.
   EXPECT_EQ(LoginReputationClientResponse::LOW_REPUTATION,
             password_protection_service_->GetCachedVerdict(
-                content_setting_map_.get(), GURL("http://test.com/abc/")));
-  EXPECT_EQ(
-      LoginReputationClientResponse::LOW_REPUTATION,
-      password_protection_service_->GetCachedVerdict(
-          content_setting_map_.get(), GURL("http://test.com/abc/bar.jsp")));
+                content_setting_map_.get(), GURL("http://test.com/abc/"),
+                &actual_verdict));
+  EXPECT_EQ(LoginReputationClientResponse::LOW_REPUTATION,
+            password_protection_service_->GetCachedVerdict(
+                content_setting_map_.get(), GURL("http://test.com/abc/bar.jsp"),
+                &actual_verdict));
   EXPECT_EQ(LoginReputationClientResponse::LOW_REPUTATION,
             password_protection_service_->GetCachedVerdict(
                 content_setting_map_.get(),
-                GURL("http://test.com/abc/foo/bar.html")));
+                GURL("http://test.com/abc/foo/bar.html"), &actual_verdict));
 }
 
 TEST_F(PasswordProtectionServiceTest, TestCleanUpCachedVerdicts) {
-  ASSERT_EQ(0U, GetPasswordProtectionSettingCount());
+  ASSERT_EQ(0U, GetStoredVerdictCount());
   // Prepare 2 verdicts. One is for origin "http://foo.com", and the other is
   // for "http://bar.com".
   base::Time now = base::Time::Now();
@@ -376,7 +433,7 @@
   CacheVerdict(GURL("http://bar.com/index.jsp"),
                LoginReputationClientResponse::PHISHING, 10 * 60, "bar.com",
                false, now);
-  ASSERT_EQ(2U, GetPasswordProtectionSettingCount());
+  ASSERT_EQ(2U, GetStoredVerdictCount());
 
   // Delete a bar.com URL. Corresponding content setting keyed on
   // origin "http://bar.com" should be removed,
@@ -384,16 +441,162 @@
   deleted_urls.push_back(history::URLRow(GURL("http://bar.com")));
   password_protection_service_->RemoveContentSettingsOnURLsDeleted(
       false /* all_history */, deleted_urls, content_setting_map_.get());
-  EXPECT_EQ(1U, GetPasswordProtectionSettingCount());
-  EXPECT_EQ(LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED,
-            password_protection_service_->GetCachedVerdict(
-                content_setting_map_.get(), GURL("http://bar.com")));
+  EXPECT_EQ(1U, GetStoredVerdictCount());
+  LoginReputationClientResponse actual_verdict;
+  EXPECT_EQ(
+      LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED,
+      password_protection_service_->GetCachedVerdict(
+          content_setting_map_.get(), GURL("http://bar.com"), &actual_verdict));
 
   // If delete all history. All password protection content settings should be
   // gone.
   password_protection_service_->RemoveContentSettingsOnURLsDeleted(
       true /* all_history */, history::URLRows(), content_setting_map_.get());
-  EXPECT_EQ(0U, GetPasswordProtectionSettingCount());
+  EXPECT_EQ(0U, GetStoredVerdictCount());
 }
 
+TEST_F(PasswordProtectionServiceTest, TestNoRequestSentForIncognito) {
+  histograms_.ExpectTotalCount(kRequestOutcomeHistogramName, 0);
+  InitializeAndStartRequest(true /* extended_reporting */, true /* incognito */,
+                            false /* match whitelist */, 10 /* timeout */);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(nullptr, password_protection_service_->latest_response());
+  EXPECT_THAT(histograms_.GetAllSamples(kRequestOutcomeHistogramName),
+              testing::ElementsAre(base::Bucket(7 /* INCOGNITO */, 1)));
+}
+
+TEST_F(PasswordProtectionServiceTest,
+       TestNoRequestSentForNonExtendedReporting) {
+  histograms_.ExpectTotalCount(kRequestOutcomeHistogramName, 0);
+
+  InitializeAndStartRequest(false /* extended_reporting */,
+                            false /* incognito */, false /* match whitelist */,
+                            10000 /* timeout in ms*/);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(nullptr, password_protection_service_->latest_response());
+  EXPECT_THAT(
+      histograms_.GetAllSamples(kRequestOutcomeHistogramName),
+      testing::ElementsAre(base::Bucket(6 /* NO_EXTENDED_REPORTING */, 1)));
+}
+
+TEST_F(PasswordProtectionServiceTest, TestNoRequestSentForWhitelistedURL) {
+  histograms_.ExpectTotalCount(kRequestOutcomeHistogramName, 0);
+  InitializeAndStartRequest(true /* extended_reporting */,
+                            false /* incognito */, true /* match whitelist */,
+                            10000 /* timeout in ms*/);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(nullptr, password_protection_service_->latest_response());
+  EXPECT_THAT(histograms_.GetAllSamples(kRequestOutcomeHistogramName),
+              testing::ElementsAre(base::Bucket(4 /* MATCHED_WHITELIST */, 1)));
+}
+
+TEST_F(PasswordProtectionServiceTest, TestNoRequestSentIfVerdictAlreadyCached) {
+  histograms_.ExpectTotalCount(kRequestOutcomeHistogramName, 0);
+  CacheVerdict(GURL(kTargetUrl), LoginReputationClientResponse::LOW_REPUTATION,
+               600, GURL(kTargetUrl).host(), true, base::Time::Now());
+  InitializeAndStartRequest(true /* extended_reporting */,
+                            false /* incognito */, false /* match whitelist */,
+                            10000 /* timeout in ms*/);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_THAT(
+      histograms_.GetAllSamples(kRequestOutcomeHistogramName),
+      testing::ElementsAre(base::Bucket(5 /* RESPONSE_ALREADY_CACHED */, 1)));
+  EXPECT_EQ(LoginReputationClientResponse::LOW_REPUTATION,
+            password_protection_service_->latest_response()->verdict_type());
+}
+
+TEST_F(PasswordProtectionServiceTest, TestResponseFetchFailed) {
+  histograms_.ExpectTotalCount(kRequestOutcomeHistogramName, 0);
+  net::TestURLFetcher failed_fetcher(0, GURL("http://bar.com"), nullptr);
+  // Set up failed response.
+  failed_fetcher.set_status(
+      net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED));
+
+  InitializeAndStartRequest(true /* extended_reporting */,
+                            false /* incognito */, false /* match whitelist */,
+                            10000 /* timeout in ms*/);
+  request_->OnURLFetchComplete(&failed_fetcher);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(nullptr, password_protection_service_->latest_response());
+  EXPECT_THAT(histograms_.GetAllSamples(kRequestOutcomeHistogramName),
+              testing::ElementsAre(base::Bucket(9 /* FETCH_FAILED */, 1)));
+}
+
+TEST_F(PasswordProtectionServiceTest, TestMalformedResponse) {
+  histograms_.ExpectTotalCount(kRequestOutcomeHistogramName, 0);
+  // Set up malformed response.
+  net::TestURLFetcher fetcher(0, GURL("http://bar.com"), nullptr);
+  fetcher.set_status(
+      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK));
+  fetcher.set_response_code(200);
+  fetcher.SetResponseString("invalid response");
+
+  InitializeAndStartRequest(true /* extended_reporting */,
+                            false /* incognito */, false /* match whitelist */,
+                            10000 /* timeout in ms*/);
+  request_->OnURLFetchComplete(&fetcher);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(nullptr, password_protection_service_->latest_response());
+  EXPECT_THAT(
+      histograms_.GetAllSamples(kRequestOutcomeHistogramName),
+      testing::ElementsAre(base::Bucket(10 /* RESPONSE_MALFORMED */, 1)));
+}
+
+TEST_F(PasswordProtectionServiceTest, TestRequestTimedout) {
+  histograms_.ExpectTotalCount(kRequestOutcomeHistogramName, 0);
+  InitializeAndStartRequest(true /* extended_reporting */,
+                            false /* incognito */, false /* match whitelist */,
+                            0 /* timeout immediately */);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(nullptr, password_protection_service_->latest_response());
+  EXPECT_THAT(histograms_.GetAllSamples(kRequestOutcomeHistogramName),
+              testing::ElementsAre(base::Bucket(3 /* TIMEDOUT */, 1)));
+}
+
+TEST_F(PasswordProtectionServiceTest, TestRequestAndResponseSuccessfull) {
+  histograms_.ExpectTotalCount(kRequestOutcomeHistogramName, 0);
+  // Set up valid response.
+  net::TestURLFetcher fetcher(0, GURL("http://bar.com"), nullptr);
+  fetcher.set_status(
+      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK));
+  fetcher.set_response_code(200);
+  LoginReputationClientResponse expected_response =
+      CreateVerdictProto(LoginReputationClientResponse::PHISHING, 600,
+                         GURL(kTargetUrl).host(), true);
+  fetcher.SetResponseString(expected_response.SerializeAsString());
+
+  InitializeAndStartRequest(true /* extended_reporting */,
+                            false /* incognito */, false /* match whitelist */,
+                            10000 /* timeout in ms*/);
+  request_->OnURLFetchComplete(&fetcher);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_THAT(histograms_.GetAllSamples(kRequestOutcomeHistogramName),
+              testing::ElementsAre(base::Bucket(1 /* SUCCEEDED */, 1)));
+  LoginReputationClientResponse* actual_response =
+      password_protection_service_->latest_response();
+  EXPECT_EQ(expected_response.verdict_type(), actual_response->verdict_type());
+  EXPECT_EQ(expected_response.cache_expression(),
+            actual_response->cache_expression());
+  EXPECT_EQ(expected_response.cache_expression_exact_match(),
+            actual_response->cache_expression_exact_match());
+  EXPECT_EQ(expected_response.cache_duration_sec(),
+            actual_response->cache_duration_sec());
+}
+
+TEST_F(PasswordProtectionServiceTest, TestTearDownWithPendingRequests) {
+  histograms_.ExpectTotalCount(kRequestOutcomeHistogramName, 0);
+  GURL target_url(kTargetUrl);
+  EXPECT_CALL(*database_manager_.get(), MatchCsdWhitelistUrl(target_url))
+      .WillRepeatedly(testing::Return(false));
+  password_protection_service_->StartRequest(
+      target_url, LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE,
+      true /* extended_reporting */, false /* incognito */);
+
+  // Destroy password_protection_service_ while there is one request pending.
+  password_protection_service_.reset();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_THAT(histograms_.GetAllSamples(kRequestOutcomeHistogramName),
+              testing::ElementsAre(base::Bucket(2 /* CANCELED */, 1)));
+}
 }  // namespace safe_browsing
diff --git a/components/sync/base/ordinal.h b/components/sync/base/ordinal.h
index 92fc5eea..89dd3e7 100644
--- a/components/sync/base/ordinal.h
+++ b/components/sync/base/ordinal.h
@@ -405,7 +405,6 @@
 int Ordinal<Traits>::AddDigitValue(std::string* bytes,
                                    size_t i,
                                    int digit_value) {
-  DCHECK_GE(i, 0U);
   DCHECK_LT(i, bytes->length());
 
   for (int j = static_cast<int>(i); j >= 0 && digit_value > 0; --j) {
diff --git a/components/test/data/autofill/OWNERS b/components/test/data/autofill/OWNERS
index 2cb1b739..8d6b49f 100644
--- a/components/test/data/autofill/OWNERS
+++ b/components/test/data/autofill/OWNERS
@@ -1,7 +1,4 @@
 estade@chromium.org
 mathp@chromium.org
 
-# Owner for password autofill/generation only.
-gcasto@chromium.org
-
 # COMPONENT: UI>Browser>Autofill
diff --git a/components/test/data/password_manager/OWNERS b/components/test/data/password_manager/OWNERS
index acc1360..e8e1954b 100644
--- a/components/test/data/password_manager/OWNERS
+++ b/components/test/data/password_manager/OWNERS
@@ -1,4 +1,3 @@
-gcasto@chromium.org
 mkwst@chromium.org
 vabr@chromium.org
 
diff --git a/components/tracing/child/child_trace_message_filter.cc b/components/tracing/child/child_trace_message_filter.cc
index 6012a96a..2cd76dc7 100644
--- a/components/tracing/child/child_trace_message_filter.cc
+++ b/components/tracing/child/child_trace_message_filter.cc
@@ -27,7 +27,9 @@
 
 ChildTraceMessageFilter::ChildTraceMessageFilter(
     base::SingleThreadTaskRunner* ipc_task_runner)
-    : sender_(NULL), ipc_task_runner_(ipc_task_runner) {}
+    : enabled_tracing_modes_(0),
+      sender_(NULL),
+      ipc_task_runner_(ipc_task_runner) {}
 
 void ChildTraceMessageFilter::OnFilterAdded(IPC::Channel* channel) {
   sender_ = channel;
@@ -77,13 +79,17 @@
   TraceLog::GetInstance()->SetTimeOffset(time_offset);
 #endif
   MemoryDumpManager::GetInstance()->set_tracing_process_id(tracing_process_id);
-  TraceLog::GetInstance()->SetEnabled(
-      base::trace_event::TraceConfig(trace_config_str),
-      base::trace_event::TraceLog::RECORDING_MODE);
+  const base::trace_event::TraceConfig trace_config(trace_config_str);
+  enabled_tracing_modes_ = base::trace_event::TraceLog::RECORDING_MODE;
+  if (!trace_config.event_filters().empty())
+    enabled_tracing_modes_ |= base::trace_event::TraceLog::FILTERING_MODE;
+  TraceLog::GetInstance()->SetEnabled(trace_config, enabled_tracing_modes_);
 }
 
 void ChildTraceMessageFilter::OnEndTracing() {
-  TraceLog::GetInstance()->SetDisabled();
+  DCHECK(enabled_tracing_modes_);
+  TraceLog::GetInstance()->SetDisabled(enabled_tracing_modes_);
+  enabled_tracing_modes_ = 0;
 
   // Flush will generate one or more callbacks to OnTraceDataCollected
   // synchronously or asynchronously. EndTracingAck will be sent in the last
diff --git a/components/tracing/child/child_trace_message_filter.h b/components/tracing/child/child_trace_message_filter.h
index 619de78..929fa7e2 100644
--- a/components/tracing/child/child_trace_message_filter.h
+++ b/components/tracing/child/child_trace_message_filter.h
@@ -73,6 +73,8 @@
 
   void SetSenderForTesting(IPC::Sender* sender);
 
+  uint8_t enabled_tracing_modes_;
+
   IPC::Sender* sender_;
   base::SingleThreadTaskRunner* ipc_task_runner_;
 
diff --git a/components/tracing/common/trace_startup.cc b/components/tracing/common/trace_startup.cc
index 2c8ae37..551564c6 100644
--- a/components/tracing/common/trace_startup.cc
+++ b/components/tracing/common/trace_startup.cc
@@ -38,10 +38,14 @@
         trace_config, base::trace_event::TraceLog::RECORDING_MODE);
   } else if (can_access_file_system &&
              tracing::TraceConfigFile::GetInstance()->IsEnabled()) {
+    const base::trace_event::TraceConfig& trace_config =
+        tracing::TraceConfigFile::GetInstance()->GetTraceConfig();
+    uint8_t modes = base::trace_event::TraceLog::RECORDING_MODE;
+    if (!trace_config.event_filters().empty())
+      modes |= base::trace_event::TraceLog::FILTERING_MODE;
     // This checks kTraceConfigFile switch.
     base::trace_event::TraceLog::GetInstance()->SetEnabled(
-        tracing::TraceConfigFile::GetInstance()->GetTraceConfig(),
-        base::trace_event::TraceLog::RECORDING_MODE);
+        tracing::TraceConfigFile::GetInstance()->GetTraceConfig(), modes);
   }
 }
 
diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc
index ea1a1f9e..92de40f 100644
--- a/components/translate/core/browser/translate_manager.cc
+++ b/components/translate/core/browser/translate_manager.cc
@@ -182,6 +182,7 @@
   if (!prefs->GetBoolean(prefs::kEnableTranslate)) {
     TranslateBrowserMetrics::ReportInitiationStatus(
         TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_PREFS);
+    RecordTranslateEvent(metrics::TranslateEventProto::DISABLED_BY_PREF);
     const std::string& locale =
         TranslateDownloadManager::GetInstance()->application_locale();
     TranslateBrowserMetrics::ReportLocalesOnDisabledByPrefs(locale);
@@ -295,7 +296,7 @@
   if (LanguageInULP(language_code)) {
     TranslateBrowserMetrics::ReportInitiationStatus(
         TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IN_ULP);
-    RecordTranslateEvent(metrics::TranslateEventProto::DISABLED_BY_PREF);
+    RecordTranslateEvent(metrics::TranslateEventProto::LANGUAGE_IN_ULP);
     return;
   }
 
diff --git a/components/wallpaper/wallpaper_color_calculator.cc b/components/wallpaper/wallpaper_color_calculator.cc
index 0096d5d..63293c5 100644
--- a/components/wallpaper/wallpaper_color_calculator.cc
+++ b/components/wallpaper/wallpaper_color_calculator.cc
@@ -67,6 +67,9 @@
   UMA_HISTOGRAM_MEDIUM_TIMES("Ash.Wallpaper.TimeSpentExtractingColors",
                              base::Time::Now() - start_calculation_time_);
 
+  UMA_HISTOGRAM_BOOLEAN("Ash.Wallpaper.ColorExtractionResult",
+                        prominent_color != SK_ColorTRANSPARENT);
+
   prominent_color_ = prominent_color;
   for (auto& observer : observers_)
     observer.OnColorCalculationComplete();
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 6811c16..a40982f 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -103,6 +103,7 @@
     "//services/catalog:constants",
     "//services/catalog/public/cpp",
     "//services/catalog/public/interfaces:constants",
+    "//services/data_decoder/public/interfaces",
     "//services/device:lib",
     "//services/device/public/interfaces:constants",
     "//services/file:lib",
diff --git a/content/browser/appcache/OWNERS b/content/browser/appcache/OWNERS
index 3723f40..92b1943 100644
--- a/content/browser/appcache/OWNERS
+++ b/content/browser/appcache/OWNERS
@@ -1 +1,4 @@
 michaeln@chromium.org
+
+# TEAM: storage-dev@chromium.org
+# COMPONENT: Blink>Storage>AppCache
diff --git a/content/browser/background_fetch/background_fetch_service_impl.cc b/content/browser/background_fetch/background_fetch_service_impl.cc
index ac93b612..582827e4 100644
--- a/content/browser/background_fetch/background_fetch_service_impl.cc
+++ b/content/browser/background_fetch/background_fetch_service_impl.cc
@@ -12,6 +12,7 @@
 #include "content/common/background_fetch/background_fetch_types.h"
 #include "content/public/browser/browser_thread.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "url/origin.h"
 
 namespace content {
 
@@ -39,6 +40,7 @@
 BackgroundFetchServiceImpl::~BackgroundFetchServiceImpl() = default;
 
 void BackgroundFetchServiceImpl::Fetch(int64_t service_worker_registration_id,
+                                       const url::Origin& origin,
                                        const std::string& tag,
                                        const BackgroundFetchOptions& options,
                                        const FetchCallback& callback) {
@@ -59,6 +61,7 @@
 
 void BackgroundFetchServiceImpl::UpdateUI(
     int64_t service_worker_registration_id,
+    const url::Origin& origin,
     const std::string& tag,
     const std::string& title,
     const UpdateUICallback& callback) {
@@ -71,6 +74,7 @@
 }
 
 void BackgroundFetchServiceImpl::Abort(int64_t service_worker_registration_id,
+                                       const url::Origin& origin,
                                        const std::string& tag,
                                        const AbortCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -83,6 +87,7 @@
 
 void BackgroundFetchServiceImpl::GetRegistration(
     int64_t service_worker_registration_id,
+    const url::Origin& origin,
     const std::string& tag,
     const GetRegistrationCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -95,6 +100,7 @@
 }
 
 void BackgroundFetchServiceImpl::GetTags(int64_t service_worker_registration_id,
+                                         const url::Origin& origin,
                                          const GetTagsCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
diff --git a/content/browser/background_fetch/background_fetch_service_impl.h b/content/browser/background_fetch/background_fetch_service_impl.h
index 17f84230..de6299b 100644
--- a/content/browser/background_fetch/background_fetch_service_impl.h
+++ b/content/browser/background_fetch/background_fetch_service_impl.h
@@ -13,6 +13,10 @@
 #include "base/memory/ref_counted.h"
 #include "third_party/WebKit/public/platform/modules/background_fetch/background_fetch.mojom.h"
 
+namespace url {
+class Origin;
+}
+
 namespace content {
 
 class BackgroundFetchContext;
@@ -33,20 +37,25 @@
 
   // blink::mojom::BackgroundFetchService implementation.
   void Fetch(int64_t service_worker_registration_id,
+             const url::Origin& origin,
              const std::string& tag,
              const BackgroundFetchOptions& options,
              const FetchCallback& callback) override;
   void UpdateUI(int64_t service_worker_registration_id,
+                const url::Origin& origin,
                 const std::string& tag,
                 const std::string& title,
                 const UpdateUICallback& callback) override;
   void Abort(int64_t service_worker_registration_id,
+             const url::Origin& origin,
              const std::string& tag,
              const AbortCallback& callback) override;
   void GetRegistration(int64_t service_worker_registration_id,
+                       const url::Origin& origin,
                        const std::string& tag,
                        const GetRegistrationCallback& callback) override;
   void GetTags(int64_t service_worker_registration_id,
+               const url::Origin& origin,
                const GetTagsCallback& callback) override;
 
  private:
diff --git a/content/browser/download/download_file_impl.cc b/content/browser/download/download_file_impl.cc
index 4b47ae1f..f97c00f6 100644
--- a/content/browser/download/download_file_impl.cc
+++ b/content/browser/download/download_file_impl.cc
@@ -31,6 +31,8 @@
 
 namespace content {
 
+namespace {
+
 const int kUpdatePeriodMs = 500;
 const int kMaxTimeBlockingFileThreadMs = 1000;
 
@@ -42,6 +44,12 @@
 // Number of times a failing rename is retried before giving up.
 const int kMaxRenameRetries = 3;
 
+// Because DownloadSaveInfo::kLengthFullContent is 0, we should avoid using
+// 0 for length if we found that a stream can no longer write any data.
+const int kNoBytesToWrite = -1;
+
+}  // namespace
+
 DownloadFileImpl::SourceStream::SourceStream(
     int64_t offset,
     int64_t length,
@@ -59,6 +67,25 @@
   bytes_written_ += bytes_write;
 }
 
+void DownloadFileImpl::SourceStream::TruncateLengthWithWrittenDataBlock(
+    int64_t offset,
+    int64_t bytes_written) {
+  DCHECK_GT(bytes_written, 0);
+  if (length_ == kNoBytesToWrite)
+    return;
+
+  if (offset <= offset_) {
+    if (offset + bytes_written > offset_)
+      length_ = kNoBytesToWrite;
+    return;
+  }
+
+  if (length_ == DownloadSaveInfo::kLengthFullContent ||
+      length_ > offset - offset_) {
+    length_ = offset - offset_;
+  }
+}
+
 DownloadFileImpl::DownloadFileImpl(
     std::unique_ptr<DownloadSaveInfo> save_info,
     const base::FilePath& default_download_directory,
@@ -161,6 +188,11 @@
 bool DownloadFileImpl::CalculateBytesToWrite(SourceStream* source_stream,
                                              size_t bytes_available_to_write,
                                              size_t* bytes_to_write) {
+  if (source_stream->length() == kNoBytesToWrite) {
+    *bytes_to_write = 0;
+    return true;
+  }
+
   // If a new slice finds that its target position has already been written,
   // terminate the stream.
   if (source_stream->bytes_written() == 0) {
@@ -448,6 +480,11 @@
     stream_reader->RegisterCallback(base::Bind(&DownloadFileImpl::StreamActive,
                                                weak_factory_.GetWeakPtr(),
                                                source_stream));
+    // Truncate |source_stream|'s length if necessary.
+    for (const auto& received_slice : received_slices_) {
+      source_stream->TruncateLengthWithWrittenDataBlock(
+          received_slice.offset, received_slice.received_bytes);
+    }
     StreamActive(source_stream);
     num_active_streams_++;
   }
@@ -503,12 +540,8 @@
         source_stream->set_index(source_stream->index() + 1);
     } else if (source_stream->offset() == offset) {
       source_stream->set_index(index);
-    } else if (source_stream->length() ==
-                   DownloadSaveInfo::kLengthFullContent ||
-               source_stream->length() > offset - source_stream->offset()) {
-      // The newly introduced slice will impact the length of the SourceStreams
-      // preceding it.
-      source_stream->set_length(offset - source_stream->offset());
+    } else {
+      source_stream->TruncateLengthWithWrittenDataBlock(offset, length);
     }
   }
 }
@@ -564,7 +597,7 @@
 
   bool can_recover_from_error = false;
 
-  if (is_sparse_file_) {
+  if (is_sparse_file_ && source_stream->length() != kNoBytesToWrite) {
     // If a neighboring stream request is available, check if it can help
     // download all the data left by |source stream| or has already done so. We
     // want to avoid the situation that a server always fail additional requests
@@ -637,6 +670,19 @@
   return ret;
 }
 
+void DownloadFileImpl::DebugStates() const {
+  DVLOG(1) << "### Debugging DownloadFile states:";
+  DVLOG(1) << "Total source stream count = " << source_streams_.size();
+  for (const auto& stream : source_streams_) {
+    DVLOG(1) << "Source stream, offset = " << stream.second->offset()
+             << " , bytes_written = " << stream.second->bytes_written()
+             << " , is_finished = " << stream.second->is_finished()
+             << " , length = " << stream.second->length();
+  }
+
+  DebugSlicesInfo(received_slices_);
+}
+
 DownloadFileImpl::RenameParameters::RenameParameters(
     RenameOption option,
     const base::FilePath& new_path,
diff --git a/content/browser/download/download_file_impl.h b/content/browser/download/download_file_impl.h
index c6a4ae2..7b9ea68 100644
--- a/content/browser/download/download_file_impl.h
+++ b/content/browser/download/download_file_impl.h
@@ -106,6 +106,11 @@
     // Called after successfully writing a buffer to disk.
     void OnWriteBytesToDisk(int64_t bytes_write);
 
+    // Given a data block that is already written, truncate the length of this
+    // object to avoid overwriting that block.
+    void TruncateLengthWithWrittenDataBlock(int64_t offset,
+                                            int64_t bytes_written);
+
     ByteStreamReader* stream_reader() const { return stream_reader_.get(); }
     int64_t offset() const { return offset_; }
     int64_t length() const { return length_; }
@@ -221,6 +226,9 @@
   // SourceStreams are ordered by their offsets
   SourceStream* FindPrecedingNeighbor(SourceStream* source_stream);
 
+  // Print the internal states for debugging.
+  void DebugStates() const;
+
   net::NetLogWithSource net_log_;
 
   // The base file instance.
diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc
index cbc8cbe..71758ea 100644
--- a/content/browser/download/download_item_impl.cc
+++ b/content/browser/download/download_item_impl.cc
@@ -1990,7 +1990,6 @@
     std::vector<DownloadItem::ReceivedSlice> slices_to_download
         = FindSlicesToDownload(received_slices_);
     download_params->set_offset(slices_to_download[0].offset);
-    download_params->set_length(slices_to_download[0].received_bytes);
   } else {
     download_params->set_offset(GetReceivedBytes());
   }
diff --git a/content/browser/download/parallel_download_utils.cc b/content/browser/download/parallel_download_utils.cc
index b3e6ee8..a54cfa67 100644
--- a/content/browser/download/parallel_download_utils.cc
+++ b/content/browser/download/parallel_download_utils.cc
@@ -162,4 +162,12 @@
              : base::TimeDelta::FromMilliseconds(0);
 }
 
+void DebugSlicesInfo(const DownloadItem::ReceivedSlices& slices) {
+  DVLOG(1) << "Received slices size : " << slices.size();
+  for (const auto& it : slices) {
+    DVLOG(1) << "Slice offset = " << it.offset
+             << " , received_bytes = " << it.received_bytes;
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/download/parallel_download_utils.h b/content/browser/download/parallel_download_utils.h
index c8cef6f..7e31257 100644
--- a/content/browser/download/parallel_download_utils.h
+++ b/content/browser/download/parallel_download_utils.h
@@ -51,6 +51,9 @@
 // request is handled.
 CONTENT_EXPORT base::TimeDelta GetParallelRequestDelayConfig();
 
+// Print the states of received slices for debugging.
+CONTENT_EXPORT void DebugSlicesInfo(const DownloadItem::ReceivedSlices& slices);
+
 }  //  namespace content
 
 #endif  // CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_UTILS_H_
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc
index de1df6f7..288bcec 100644
--- a/content/browser/frame_host/frame_tree_node.cc
+++ b/content/browser/frame_host/frame_tree_node.cc
@@ -383,8 +383,14 @@
   // There's no need to reset the state: there's still an ongoing load, and the
   // RenderFrameHostManager will take care of updates to the speculative
   // RenderFrameHost in DidCreateNavigationRequest below.
-  if (was_previously_loading)
+  if (was_previously_loading) {
+    if (navigation_request_) {
+      // Mark the old request as aborted.
+      navigation_request_->navigation_handle()->set_net_error_code(
+          net::ERR_ABORTED);
+    }
     ResetNavigationRequest(true, true);
+  }
 
   navigation_request_ = std::move(navigation_request);
   render_manager()->DidCreateNavigationRequest(navigation_request_.get());
diff --git a/content/browser/frame_host/navigation_handle_impl_browsertest.cc b/content/browser/frame_host/navigation_handle_impl_browsertest.cc
index d92c5dd..cfab729 100644
--- a/content/browser/frame_host/navigation_handle_impl_browsertest.cc
+++ b/content/browser/frame_host/navigation_handle_impl_browsertest.cc
@@ -1120,6 +1120,22 @@
   EXPECT_EQ(finished_navigation, logger.finished_navigation_urls());
 }
 
+// Tests that when a navigation starts while there's an existing one, the first
+// one has the right error code set on its navigation handle.
+IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest, ErrorCodeOnCancel) {
+  GURL slow_url = embedded_test_server()->GetURL("/slow?60");
+  NavigationHandleObserver observer(shell()->web_contents(), slow_url);
+  shell()->LoadURL(slow_url);
+
+  GURL url2(embedded_test_server()->GetURL("/title1.html"));
+  TestNavigationObserver same_tab_observer(
+      shell()->web_contents(), 1);
+  shell()->LoadURL(url2);
+  same_tab_observer.Wait();
+
+  EXPECT_EQ(net::ERR_ABORTED, observer.net_error_code());
+}
+
 // This class allows running tests with PlzNavigate enabled, regardless of
 // default test configuration.
 class PlzNavigateNavigationHandleImplBrowserTest : public ContentBrowserTest {
diff --git a/content/browser/frame_host/render_frame_host_android.cc b/content/browser/frame_host/render_frame_host_android.cc
index aa84f81..fd68c5e 100644
--- a/content/browser/frame_host/render_frame_host_android.cc
+++ b/content/browser/frame_host/render_frame_host_android.cc
@@ -8,6 +8,8 @@
 #include "base/logging.h"
 #include "content/browser/frame_host/render_frame_host_delegate.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/site_instance.h"
 #include "jni/RenderFrameHostImpl_jni.h"
 
 using base::android::AttachCurrentThread;
@@ -39,9 +41,13 @@
 RenderFrameHostAndroid::GetJavaObject() {
   JNIEnv* env = base::android::AttachCurrentThread();
   if (obj_.is_uninitialized()) {
+    bool is_incognito = render_frame_host_->GetSiteInstance()
+                            ->GetBrowserContext()
+                            ->IsOffTheRecord();
     ScopedJavaLocalRef<jobject> local_ref = Java_RenderFrameHostImpl_create(
         env, reinterpret_cast<intptr_t>(this),
-        render_frame_host_->delegate()->GetJavaRenderFrameHostDelegate());
+        render_frame_host_->delegate()->GetJavaRenderFrameHostDelegate(),
+        is_incognito);
     obj_ = JavaObjectWeakGlobalRef(env, local_ref);
     return local_ref;
   }
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc
index 319a130a..cdf3e392 100644
--- a/content/browser/gpu/gpu_data_manager_impl_private.cc
+++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -282,6 +282,20 @@
       base::Bind(&OnVideoMemoryUsageStats));
 }
 
+void UpdateGpuInfoOnIO(const gpu::GPUInfo& gpu_info) {
+  // This function is called on the IO thread, but GPUInfo on GpuDataManagerImpl
+  // should be updated on the UI thread (since it can call into functions that
+  // expect to run in the UI thread, e.g. ContentClient::SetGpuInfo()).
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::Bind(
+          [](const gpu::GPUInfo& gpu_info) {
+            TRACE_EVENT0("test_gpu", "OnGraphicsInfoCollected");
+            GpuDataManagerImpl::GetInstance()->UpdateGpuInfo(gpu_info);
+          },
+          gpu_info));
+}
+
 }  // namespace anonymous
 
 void GpuDataManagerImplPrivate::InitializeForTesting(
@@ -418,21 +432,24 @@
 
   complete_gpu_info_already_requested_ = true;
 
-  GpuProcessHost::SendOnIO(
+  GpuProcessHost::CallOnIO(
 #if defined(OS_WIN)
       GpuProcessHost::GPU_PROCESS_KIND_UNSANDBOXED,
 #else
       GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED,
 #endif
-      true /* force_create */, new GpuMsg_CollectGraphicsInfo());
+      true /* force_create */, base::Bind([](GpuProcessHost* host) {
+        if (!host)
+          return;
+        host->gpu_service()->RequestCompleteGpuInfo(
+            base::Bind(&UpdateGpuInfoOnIO));
+      }));
 }
 
 bool GpuDataManagerImplPrivate::IsEssentialGpuInfoAvailable() const {
-  if (gpu_info_.basic_info_state == gpu::kCollectInfoNone ||
-      gpu_info_.context_info_state == gpu::kCollectInfoNone) {
-    return false;
-  }
-  return true;
+  return (gpu_info_.basic_info_state != gpu::kCollectInfoNone &&
+          gpu_info_.context_info_state != gpu::kCollectInfoNone) ||
+         use_swiftshader_;
 }
 
 bool GpuDataManagerImplPrivate::IsCompleteGpuInfoAvailable() const {
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index 4105aed1..4b4a43a 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -1241,6 +1241,11 @@
     gpu_service_ptr_->LoadedShader(data);
 }
 
+ui::mojom::GpuService* GpuProcessHost::gpu_service() {
+  DCHECK(gpu_service_ptr_.is_bound());
+  return gpu_service_ptr_.get();
+}
+
 void GpuProcessHost::CreateChannelCache(int32_t client_id) {
   TRACE_EVENT0("gpu", "GpuProcessHost::CreateChannelCache");
 
diff --git a/content/browser/gpu/gpu_process_host.h b/content/browser/gpu/gpu_process_host.h
index 9884ba0..f867dade 100644
--- a/content/browser/gpu/gpu_process_host.h
+++ b/content/browser/gpu/gpu_process_host.h
@@ -161,7 +161,7 @@
 
   void LoadedShader(const std::string& key, const std::string& data);
 
-  ui::mojom::GpuService* gpu_service() { return gpu_service_ptr_.get(); }
+  CONTENT_EXPORT ui::mojom::GpuService* gpu_service();
 
  private:
   class ConnectionFilterImpl;
diff --git a/content/browser/gpu/gpu_process_host_ui_shim.cc b/content/browser/gpu/gpu_process_host_ui_shim.cc
index e753f1a..1a910cbc 100644
--- a/content/browser/gpu/gpu_process_host_ui_shim.cc
+++ b/content/browser/gpu/gpu_process_host_ui_shim.cc
@@ -135,7 +135,8 @@
   if (message.routing_id() != MSG_ROUTING_CONTROL)
     return false;
 
-  return OnControlMessageReceived(message);
+  NOTREACHED() << "Invalid message with type = " << message.type();
+  return true;
 }
 
 GpuProcessHostUIShim::~GpuProcessHostUIShim() {
@@ -143,28 +144,6 @@
   g_hosts_by_id.Pointer()->Remove(host_id_);
 }
 
-bool GpuProcessHostUIShim::OnControlMessageReceived(
-    const IPC::Message& message) {
-  DCHECK(CalledOnValidThread());
-
-  IPC_BEGIN_MESSAGE_MAP(GpuProcessHostUIShim, message)
-    IPC_MESSAGE_HANDLER(GpuHostMsg_GraphicsInfoCollected,
-                        OnGraphicsInfoCollected)
-    IPC_MESSAGE_UNHANDLED_ERROR()
-  IPC_END_MESSAGE_MAP()
-
-  return true;
-}
-
-void GpuProcessHostUIShim::OnGraphicsInfoCollected(
-    const gpu::GPUInfo& gpu_info) {
-  // OnGraphicsInfoCollected is sent back after the GPU process successfully
-  // initializes GL.
-  TRACE_EVENT0("test_gpu", "OnGraphicsInfoCollected");
-
-  GpuDataManagerImpl::GetInstance()->UpdateGpuInfo(gpu_info);
-}
-
 #if defined(OS_ANDROID)
 // static
 void GpuProcessHostUIShim::RegisterUIThreadMojoInterfaces(
diff --git a/content/browser/gpu/gpu_process_host_ui_shim.h b/content/browser/gpu/gpu_process_host_ui_shim.h
index ec30dc8b..68c1ea7 100644
--- a/content/browser/gpu/gpu_process_host_ui_shim.h
+++ b/content/browser/gpu/gpu_process_host_ui_shim.h
@@ -71,10 +71,6 @@
   explicit GpuProcessHostUIShim(int host_id);
   ~GpuProcessHostUIShim() override;
 
-  // Message handlers.
-  bool OnControlMessageReceived(const IPC::Message& message);
-  void OnGraphicsInfoCollected(const gpu::GPUInfo& gpu_info);
-
   // The serial number of the GpuProcessHost / GpuProcessHostUIShim pair.
   int host_id_;
 };
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index 4a592ee..dc7074a 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -1167,7 +1167,8 @@
   }
   ContinuePendingBeginRequest(
       requester_info, request_id, request_data, sync_result_handler, route_id,
-      headers, std::move(mojo_request), std::move(url_loader_client), true, 0);
+      headers, std::move(mojo_request), std::move(url_loader_client),
+      HeaderInterceptorResult::CONTINUE);
 }
 
 void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
@@ -1179,13 +1180,14 @@
     const net::HttpRequestHeaders& headers,
     mojom::URLLoaderAssociatedRequest mojo_request,
     mojom::URLLoaderClientPtr url_loader_client,
-    bool continue_request,
-    int error_code) {
+    HeaderInterceptorResult interceptor_result) {
   DCHECK(requester_info->IsRenderer() || requester_info->IsNavigationPreload());
-  if (!continue_request) {
-    if (requester_info->IsRenderer()) {
+  if (interceptor_result != HeaderInterceptorResult::CONTINUE) {
+    if (requester_info->IsRenderer() &&
+        interceptor_result == HeaderInterceptorResult::KILL) {
       // TODO(ananta): Find a way to specify the right error code here. Passing
-      // in a non-content error code is not safe.
+      // in a non-content error code is not safe, but future header interceptors
+      // might say to kill for reasons other than illegal origins.
       bad_message::ReceivedBadMessage(requester_info->filter(),
                                       bad_message::RDH_ILLEGAL_ORIGIN);
     }
diff --git a/content/browser/loader/resource_dispatcher_host_impl.h b/content/browser/loader/resource_dispatcher_host_impl.h
index 642cf027..f039aa1 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.h
+++ b/content/browser/loader/resource_dispatcher_host_impl.h
@@ -560,9 +560,8 @@
   // decisions which could be time consuming. We allow for these decisions
   // to be made asynchronously. The request proceeds when we hear back from
   // the interceptors about whether to continue or not.
-  // The |continue_request| parameter in the function indicates whether the
-  // request should be continued or aborted. The |error_code| parameter is set
-  // if |continue_request| is false.
+  // The |interceptor_result| indicates whether the request should be continued
+  // or aborted, and in the latter case whether the renderer should be killed.
   void ContinuePendingBeginRequest(
       scoped_refptr<ResourceRequesterInfo> requester_info,
       int request_id,
@@ -572,8 +571,7 @@
       const net::HttpRequestHeaders& headers,
       mojom::URLLoaderAssociatedRequest mojo_request,
       mojom::URLLoaderClientPtr url_loader_client,
-      bool continue_request,
-      int error_code);
+      HeaderInterceptorResult interceptor_result);
 
   // Creates a ResourceHandler to be used by BeginRequest() for normal resource
   // loading.
diff --git a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc
index 64d53db..c6894b05 100644
--- a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc
+++ b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc
@@ -137,11 +137,6 @@
   return it->second->renderer_data.plugin_url;
 }
 
-void BrowserPpapiHostImpl::SetOnKeepaliveCallback(
-    const BrowserPpapiHost::OnKeepaliveCallback& callback) {
-  on_keepalive_callback_ = callback;
-}
-
 bool BrowserPpapiHostImpl::IsPotentiallySecurePluginContext(
     PP_Instance instance) {
   auto it = instance_map_.find(instance);
@@ -208,7 +203,6 @@
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(BrowserPpapiHostImpl::HostMessageFilter, msg)
   // Add necessary message handlers here.
-  IPC_MESSAGE_HANDLER(PpapiHostMsg_Keepalive, OnKeepalive)
   IPC_MESSAGE_HANDLER(PpapiHostMsg_LogInterfaceUsage,
                       OnHostMsgLogInterfaceUsage)
   IPC_MESSAGE_UNHANDLED(handled = ppapi_host_->OnMessageReceived(msg))
@@ -224,11 +218,6 @@
 
 BrowserPpapiHostImpl::HostMessageFilter::~HostMessageFilter() {}
 
-void BrowserPpapiHostImpl::HostMessageFilter::OnKeepalive() {
-  if (browser_ppapi_host_impl_)
-    browser_ppapi_host_impl_->OnKeepalive();
-}
-
 void BrowserPpapiHostImpl::HostMessageFilter::OnHostMsgLogInterfaceUsage(
     int hash) const {
   UMA_HISTOGRAM_SPARSE_SLOWLY("Pepper.InterfaceUsed", hash);
@@ -242,33 +231,4 @@
 BrowserPpapiHostImpl::InstanceData::~InstanceData() {
 }
 
-void BrowserPpapiHostImpl::OnKeepalive() {
-  // An instance has been active. The on_keepalive_callback_ will be
-  // used to permit the content embedder to handle this, e.g. by tracking
-  // activity and shutting down processes that go idle.
-  //
-  // Currently embedders do not need to distinguish between instances having
-  // different idle state, and thus this implementation handles all instances
-  // for this module together.
-
-  if (on_keepalive_callback_.is_null())
-    return;
-
-  BrowserPpapiHost::OnKeepaliveInstanceData instance_data(instance_map_.size());
-
-  auto instance = instance_map_.begin();
-  int i = 0;
-  while (instance != instance_map_.end()) {
-    instance_data[i].render_process_id =
-        instance->second->renderer_data.render_process_id;
-    instance_data[i].render_frame_id =
-        instance->second->renderer_data.render_frame_id;
-    instance_data[i].document_url =
-        instance->second->renderer_data.document_url;
-    ++instance;
-    ++i;
-  }
-  on_keepalive_callback_.Run(instance_data, profile_data_directory_);
-}
-
 }  // namespace content
diff --git a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.h b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.h
index 32cd6281..db48eac 100644
--- a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.h
+++ b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.h
@@ -71,8 +71,6 @@
   const base::FilePath& GetProfileDataDirectory() override;
   GURL GetDocumentURLForInstance(PP_Instance instance) override;
   GURL GetPluginURLForInstance(PP_Instance instance) override;
-  void SetOnKeepaliveCallback(
-      const BrowserPpapiHost::OnKeepaliveCallback& callback) override;
 
   // Whether the plugin context is secure. That is, it is served from a secure
   // origin and it is embedded within a hierarchy of secure frames. This value
@@ -125,7 +123,6 @@
    private:
     ~HostMessageFilter() override;
 
-    void OnKeepalive();
     void OnHostMsgLogInterfaceUsage(int hash) const;
 
     // Non owning pointers cleared in OnHostDestroyed()
@@ -143,9 +140,6 @@
     base::ObserverList<InstanceObserver> observer_list;
   };
 
-  // Reports plugin activity to the callback set with SetOnKeepaliveCallback.
-  void OnKeepalive();
-
   std::unique_ptr<ppapi::host::PpapiHost> ppapi_host_;
   base::Process plugin_process_;
   std::string plugin_name_;
@@ -166,8 +160,6 @@
 
   scoped_refptr<HostMessageFilter> message_filter_;
 
-  BrowserPpapiHost::OnKeepaliveCallback on_keepalive_callback_;
-
   DISALLOW_COPY_AND_ASSIGN(BrowserPpapiHostImpl);
 };
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
index 1131e57..c8c5e83 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -1073,8 +1073,9 @@
   base::RunLoop().RunUntilIdle();
   process_host->sink().ClearMessages();
 
-  event = MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, 0,
-                                   kCGEventMouseSubtypeTabletPoint);
+  event =
+      MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, kCGMouseButtonLeft,
+                               kCGEventMouseSubtypeTabletPoint);
   [view->cocoa_view() mouseEvent:event];
   ASSERT_EQ(1U, process_host->sink().message_count());
   EXPECT_EQ(blink::WebPointerProperties::PointerType::Eraser,
@@ -1107,8 +1108,9 @@
   base::RunLoop().RunUntilIdle();
   process_host->sink().ClearMessages();
 
-  event = MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, 0,
-                                   kCGEventMouseSubtypeTabletPoint);
+  event =
+      MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, kCGMouseButtonLeft,
+                               kCGEventMouseSubtypeTabletPoint);
   [view->cocoa_view() mouseEvent:event];
   ASSERT_EQ(1U, process_host->sink().message_count());
   EXPECT_EQ(blink::WebPointerProperties::PointerType::Pen,
@@ -1134,8 +1136,9 @@
   process_host->sink().ClearMessages();
 
   // Send a NSEvent of a mouse type.
-  NSEvent* event = MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, 0,
-                                            kCGEventMouseSubtypeDefault);
+  NSEvent* event =
+      MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, kCGMouseButtonLeft,
+                               kCGEventMouseSubtypeDefault);
   [view->cocoa_view() mouseEvent:event];
   ASSERT_EQ(1U, process_host->sink().message_count());
   EXPECT_EQ(blink::WebPointerProperties::PointerType::Mouse,
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index ed1a9a4..3683d8b 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -428,7 +428,7 @@
                           int child_process_id,
                           content::ResourceContext* resource_context,
                           OnHeaderProcessedCallback callback) {
-  callback.Run(false, content::bad_message::RDH_ILLEGAL_ORIGIN);
+  callback.Run(HeaderInterceptorResult::KILL);
 }
 
 // Renderer processes should not be able to spoof Origin HTTP headers.
diff --git a/content/browser/service_manager/service_manager_context.cc b/content/browser/service_manager/service_manager_context.cc
index 57fad6e..bc49cfb2 100644
--- a/content/browser/service_manager/service_manager_context.cc
+++ b/content/browser/service_manager/service_manager_context.cc
@@ -34,6 +34,7 @@
 #include "services/catalog/public/cpp/manifest_parsing_util.h"
 #include "services/catalog/public/interfaces/constants.mojom.h"
 #include "services/catalog/store.h"
+#include "services/data_decoder/public/interfaces/constants.mojom.h"
 #include "services/device/device_service.h"
 #include "services/device/public/interfaces/constants.mojom.h"
 #include "services/service_manager/connect_params.h"
@@ -308,6 +309,9 @@
   GetContentClient()
       ->browser()
       ->RegisterOutOfProcessServices(&sandboxed_services);
+  sandboxed_services.insert(
+      std::make_pair(data_decoder::mojom::kServiceName,
+                     base::ASCIIToUTF16("Data Decoder Service")));
   for (const auto& service : sandboxed_services) {
     packaged_services_connection_->AddServiceRequestHandler(
         service.first, base::Bind(&StartServiceInUtilityProcess, service.first,
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index ec881bf..5be9fd56 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -1483,7 +1483,7 @@
       content::ResourceContext* resource_context,
       OnHeaderProcessedCallback callback) {
     DCHECK_EQ(kNavigationPreloadHeaderName, header);
-    callback.Run(false, 0);
+    callback.Run(HeaderInterceptorResult::KILL);
   }
 
   void SetupForNavigationPreloadTest(const GURL& scope,
diff --git a/content/browser/tracing/tracing_controller_impl.cc b/content/browser/tracing/tracing_controller_impl.cc
index 6b8a58d..9e49c0be 100644
--- a/content/browser/tracing/tracing_controller_impl.cc
+++ b/content/browser/tracing/tracing_controller_impl.cc
@@ -200,7 +200,7 @@
       maximum_trace_buffer_usage_(0),
       approximate_event_count_(0),
       pending_clock_sync_ack_count_(0),
-      is_tracing_(false) {
+      enabled_tracing_modes_(0) {
   // Deliberately leaked, like this class.
   base::FileTracing::SetProvider(new FileTracingProviderImpl);
 }
@@ -234,12 +234,10 @@
 
 void TracingControllerImpl::SetEnabledOnFileThread(
     const TraceConfig& trace_config,
-    int mode,
     const base::Closure& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
 
-  TraceLog::GetInstance()->SetEnabled(
-      trace_config, static_cast<TraceLog::Mode>(mode));
+  TraceLog::GetInstance()->SetEnabled(trace_config, enabled_tracing_modes_);
   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback);
 }
 
@@ -247,7 +245,8 @@
     const base::Closure& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
 
-  TraceLog::GetInstance()->SetDisabled();
+  DCHECK(enabled_tracing_modes_);
+  TraceLog::GetInstance()->SetDisabled(enabled_tracing_modes_);
   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback);
 }
 
@@ -257,12 +256,16 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(additional_tracing_agents_.empty());
 
+  // TODO(ssid): Introduce a priority for tracing agents to handle multiple
+  // start and stop requests, crbug.com/705087.
   if (!can_start_tracing())
     return false;
-  is_tracing_ = true;
   start_tracing_done_callback_ = callback;
   start_tracing_trace_config_.reset(
       new base::trace_event::TraceConfig(trace_config));
+  enabled_tracing_modes_ = TraceLog::RECORDING_MODE;
+  if (!start_tracing_trace_config_->event_filters().empty())
+    enabled_tracing_modes_ |= TraceLog::FILTERING_MODE;
   metadata_.reset(new base::DictionaryValue());
   pending_start_tracing_ack_count_ = 0;
 
@@ -469,7 +472,7 @@
 }
 
 bool TracingControllerImpl::IsTracing() const {
-  return is_tracing_;
+  return !!enabled_tracing_modes_;
 }
 
 void TracingControllerImpl::AddTraceMessageFilter(
@@ -645,7 +648,7 @@
 
   // All acks (including from the subprocesses and the local trace) have been
   // received.
-  is_tracing_ = false;
+  enabled_tracing_modes_ = 0;
 
   // Trigger callback if one is set.
   if (!pending_get_categories_done_callback_.is_null()) {
@@ -776,12 +779,10 @@
           BrowserThread::FILE, FROM_HERE,
           base::Bind(&TracingControllerImpl::SetEnabledOnFileThread,
                      base::Unretained(this), trace_config,
-                     base::trace_event::TraceLog::RECORDING_MODE,
                      on_agent_started))) {
     // BrowserThread::PostTask fails if the threads haven't been created yet,
     // so it should be safe to just use TraceLog::SetEnabled directly.
-    base::trace_event::TraceLog::GetInstance()->SetEnabled(
-        trace_config, base::trace_event::TraceLog::RECORDING_MODE);
+    TraceLog::GetInstance()->SetEnabled(trace_config, enabled_tracing_modes_);
     BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, on_agent_started);
   }
 }
diff --git a/content/browser/tracing/tracing_controller_impl.h b/content/browser/tracing/tracing_controller_impl.h
index 288a5ac..ea7b3f56 100644
--- a/content/browser/tracing/tracing_controller_impl.h
+++ b/content/browser/tracing/tracing_controller_impl.h
@@ -102,12 +102,10 @@
   TracingControllerImpl();
   ~TracingControllerImpl() override;
 
-  bool can_start_tracing() const {
-    return !is_tracing_;
-  }
+  bool can_start_tracing() const { return !enabled_tracing_modes_; }
 
   bool can_stop_tracing() const {
-    return is_tracing_ && !trace_data_sink_.get();
+    return enabled_tracing_modes_ && !trace_data_sink_.get();
   }
 
   bool can_start_monitoring() const {
@@ -154,7 +152,6 @@
 
   void SetEnabledOnFileThread(
       const base::trace_event::TraceConfig& trace_config,
-      int mode,
       const base::Closure& callback);
   void SetDisabledOnFileThread(const base::Closure& callback);
   void OnAllTracingAgentsStarted();
@@ -195,7 +192,7 @@
   int pending_clock_sync_ack_count_;
   base::OneShotTimer clock_sync_timer_;
 
-  bool is_tracing_;
+  uint8_t enabled_tracing_modes_;
   bool is_monitoring_;
 
   GetCategoriesDoneCallback pending_get_categories_done_callback_;
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index c89fa4bf..d3765ab9 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2001,7 +2001,9 @@
 }
 
 RenderWidgetHostImpl* WebContentsImpl::GetMouseLockWidget() {
-  if (GetTopLevelRenderWidgetHostView()->IsMouseLocked())
+  if (GetTopLevelRenderWidgetHostView()->IsMouseLocked() ||
+      (GetFullscreenRenderWidgetHostView() &&
+       GetFullscreenRenderWidgetHostView()->IsMouseLocked()))
     return mouse_lock_widget_;
 
   return nullptr;
diff --git a/content/child/appcache/OWNERS b/content/child/appcache/OWNERS
index 3723f40..92b1943 100644
--- a/content/child/appcache/OWNERS
+++ b/content/child/appcache/OWNERS
@@ -1 +1,4 @@
 michaeln@chromium.org
+
+# TEAM: storage-dev@chromium.org
+# COMPONENT: Blink>Storage>AppCache
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc
index 1369ba4f..f91f11f 100644
--- a/content/child/child_thread_impl.cc
+++ b/content/child/child_thread_impl.cc
@@ -503,13 +503,14 @@
         ChildProcess::current()->io_task_runner()));
     channel_->AddFilter(new ChildMemoryMessageFilter());
 
-    memory_instrumentation::MemoryDumpManagerDelegateImpl::Config config(
-        GetConnector(), mojom::kBrowserServiceName);
-    auto delegate =
-        base::MakeUnique<memory_instrumentation::MemoryDumpManagerDelegateImpl>(
-            config);
-    base::trace_event::MemoryDumpManager::GetInstance()->Initialize(
-        std::move(delegate));
+    if (service_manager_connection_) {
+      memory_instrumentation::MemoryDumpManagerDelegateImpl::Config config(
+          GetConnector(), mojom::kBrowserServiceName);
+      auto delegate = base::MakeUnique<
+          memory_instrumentation::MemoryDumpManagerDelegateImpl>(config);
+      base::trace_event::MemoryDumpManager::GetInstance()->Initialize(
+          std::move(delegate));
+    }
   }
 
   // In single process mode we may already have a power monitor,
diff --git a/content/common/gpu_host_messages.h b/content/common/gpu_host_messages.h
index 1e0c6837..207110c 100644
--- a/content/common/gpu_host_messages.h
+++ b/content/common/gpu_host_messages.h
@@ -45,10 +45,6 @@
                      int32_t,                /* client_id */
                      gpu::SyncToken /* sync_token */)
 
-// Tells the GPU process to create a context for collecting graphics card
-// information.
-IPC_MESSAGE_CONTROL0(GpuMsg_CollectGraphicsInfo)
-
 // Tells the GPU process that the browser has seen a GPU switch.
 IPC_MESSAGE_CONTROL0(GpuMsg_GpuSwitched)
 
@@ -66,9 +62,5 @@
 IPC_MESSAGE_CONTROL1(GpuHostMsg_GpuMemoryBufferCreated,
                      gfx::GpuMemoryBufferHandle /* handle */)
 
-// Response from GPU to a GpuMsg_CollectGraphicsInfo.
-IPC_MESSAGE_CONTROL1(GpuHostMsg_GraphicsInfoCollected,
-                     gpu::GPUInfo /* GPU logging stats */)
-
 // Sent by the GPU process to indicate that a fields trial has been activated.
 IPC_MESSAGE_CONTROL1(GpuHostMsg_FieldTrialActivated, std::string /* name */)
diff --git a/content/gpu/gpu_child_thread.cc b/content/gpu/gpu_child_thread.cc
index 9862b5b..7e2995e 100644
--- a/content/gpu/gpu_child_thread.cc
+++ b/content/gpu/gpu_child_thread.cc
@@ -129,22 +129,16 @@
     bool dead_on_arrival,
     const gpu::GPUInfo& gpu_info,
     const gpu::GpuFeatureInfo& gpu_feature_info,
-    const DeferredMessages& deferred_messages,
+    DeferredMessages deferred_messages,
     gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory)
-    : ChildThreadImpl(GetOptions(gpu_memory_buffer_factory)),
-      dead_on_arrival_(dead_on_arrival),
-      gpu_info_(gpu_info),
-      deferred_messages_(deferred_messages),
-      in_browser_process_(false),
-      gpu_service_(new ui::GpuService(gpu_info,
-                                      std::move(watchdog_thread),
-                                      gpu_memory_buffer_factory,
-                                      ChildProcess::current()->io_task_runner(),
-                                      gpu_feature_info)),
-      gpu_main_binding_(this) {
-#if defined(OS_WIN)
-  target_services_ = NULL;
-#endif
+    : GpuChildThread(GetOptions(gpu_memory_buffer_factory),
+                     std::move(watchdog_thread),
+                     dead_on_arrival,
+                     false /* in_browser_process */,
+                     gpu_info,
+                     gpu_feature_info,
+                     gpu_memory_buffer_factory) {
+  deferred_messages_ = std::move(deferred_messages);
 }
 
 GpuChildThread::GpuChildThread(
@@ -152,28 +146,43 @@
     const gpu::GPUInfo& gpu_info,
     const gpu::GpuFeatureInfo& gpu_feature_info,
     gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory)
-    : ChildThreadImpl(ChildThreadImpl::Options::Builder()
-                          .InBrowserProcess(params)
-                          .AddStartupFilter(new GpuMemoryBufferMessageFilter(
-                              gpu_memory_buffer_factory))
-                          .ConnectToBrowser(true)
-                          .Build()),
-      dead_on_arrival_(false),
-      gpu_info_(gpu_info),
-      in_browser_process_(true),
+    : GpuChildThread(ChildThreadImpl::Options::Builder()
+                         .InBrowserProcess(params)
+                         .AddStartupFilter(new GpuMemoryBufferMessageFilter(
+                             gpu_memory_buffer_factory))
+                         .ConnectToBrowser(true)
+                         .Build(),
+                     nullptr /* watchdog_thread */,
+                     false /* dead_on_arrival */,
+                     true /* in_browser_process */,
+                     gpu_info,
+                     gpu_feature_info,
+                     gpu_memory_buffer_factory) {}
+
+GpuChildThread::GpuChildThread(
+    const ChildThreadImpl::Options& options,
+    std::unique_ptr<gpu::GpuWatchdogThread> gpu_watchdog_thread,
+    bool dead_on_arrival,
+    bool in_browser_process,
+    const gpu::GPUInfo& gpu_info,
+    const gpu::GpuFeatureInfo& gpu_feature_info,
+    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory)
+    : ChildThreadImpl(options),
+      dead_on_arrival_(dead_on_arrival),
+      in_browser_process_(in_browser_process),
       gpu_service_(new ui::GpuService(gpu_info,
-                                      nullptr /* watchdog thread */,
+                                      std::move(gpu_watchdog_thread),
                                       gpu_memory_buffer_factory,
                                       ChildProcess::current()->io_task_runner(),
                                       gpu_feature_info)),
       gpu_main_binding_(this) {
-#if defined(OS_WIN)
-  target_services_ = NULL;
-#endif
-  DCHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
-             switches::kSingleProcess) ||
-         base::CommandLine::ForCurrentProcess()->HasSwitch(
-             switches::kInProcessGPU));
+  if (in_browser_process_) {
+    DCHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
+               switches::kSingleProcess) ||
+           base::CommandLine::ForCurrentProcess()->HasSwitch(
+               switches::kInProcessGPU));
+  }
+  gpu_service_->set_in_host_process(in_browser_process_);
 }
 
 GpuChildThread::~GpuChildThread() {
@@ -184,8 +193,7 @@
 }
 
 void GpuChildThread::Init(const base::Time& process_start_time) {
-  process_start_time_ = process_start_time;
-  gpu_service_->set_in_host_process(in_browser_process_);
+  gpu_service_->set_start_time(process_start_time);
 
 #if defined(OS_ANDROID)
   // When running in in-process mode, this has been set in the browser at
@@ -226,7 +234,6 @@
 bool GpuChildThread::OnControlMessageReceived(const IPC::Message& msg) {
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(GpuChildThread, msg)
-    IPC_MESSAGE_HANDLER(GpuMsg_CollectGraphicsInfo, OnCollectGraphicsInfo)
     IPC_MESSAGE_HANDLER(GpuMsg_GpuSwitched, OnGpuSwitched)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
@@ -264,28 +271,16 @@
     const gpu::GpuPreferences& gpu_preferences,
     mojo::ScopedSharedBufferHandle activity_flags) {
   gpu_service_->Bind(std::move(request));
-
-  gpu_info_.video_decode_accelerator_capabilities =
-      media::GpuVideoDecodeAccelerator::GetCapabilities(gpu_preferences);
-  gpu_info_.video_encode_accelerator_supported_profiles =
-      media::GpuVideoEncodeAccelerator::GetSupportedProfiles(gpu_preferences);
-  gpu_info_.jpeg_decode_accelerator_supported =
-      media::GpuJpegDecodeAcceleratorFactoryProvider::
-          IsAcceleratedJpegDecodeSupported();
-
-  // Record initialization only after collecting the GPU info because that can
-  // take a significant amount of time.
-  gpu_info_.initialization_time = base::Time::Now() - process_start_time_;
-  Send(new GpuHostMsg_Initialized(!dead_on_arrival_, gpu_info_,
+  gpu_service_->UpdateGPUInfoFromPreferences(gpu_preferences);
+  Send(new GpuHostMsg_Initialized(!dead_on_arrival_, gpu_service_->gpu_info(),
                                   gpu_service_->gpu_feature_info()));
-  while (!deferred_messages_.empty()) {
-    const LogMessage& log = deferred_messages_.front();
+  for (const LogMessage& log : deferred_messages_)
     gpu_host->RecordLogMessage(log.severity, log.header, log.message);
-    deferred_messages_.pop();
-  }
+  deferred_messages_.clear();
 
   if (dead_on_arrival_) {
     LOG(ERROR) << "Exiting GPU process due to errors during initialization";
+    gpu_service_.reset();
     base::MessageLoop::current()->QuitWhenIdle();
     return;
   }
@@ -322,60 +317,6 @@
   NOTREACHED();
 }
 
-void GpuChildThread::OnCollectGraphicsInfo() {
-  if (dead_on_arrival_)
-    return;
-
-#if defined(OS_MACOSX)
-  // gpu::CollectContextGraphicsInfo() is already called during gpu process
-  // initialization (see GpuInit::InitializeAndStartSandbox()) on non-mac
-  // platforms, and during in-browser gpu thread initialization on all platforms
-  // (See InProcessGpuThread::Init()).
-  if (!in_browser_process_) {
-    DCHECK_EQ(gpu::kCollectInfoNone, gpu_info_.context_info_state);
-    gpu::CollectInfoResult result = gpu::CollectContextGraphicsInfo(&gpu_info_);
-    switch (result) {
-      case gpu::kCollectInfoFatalFailure:
-        LOG(ERROR) << "gpu::CollectGraphicsInfo failed (fatal).";
-        // TODO(piman): can we signal overall failure?
-        break;
-      case gpu::kCollectInfoNonFatalFailure:
-        DVLOG(1) << "gpu::CollectGraphicsInfo failed (non-fatal).";
-        break;
-      case gpu::kCollectInfoNone:
-        NOTREACHED();
-        break;
-      case gpu::kCollectInfoSuccess:
-        break;
-    }
-    GetContentClient()->SetGpuInfo(gpu_info_);
-  }
-#endif
-
-#if defined(OS_WIN)
-  // GPU full info collection should only happen on un-sandboxed GPU process
-  // or single process/in-process gpu mode on Windows.
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  DCHECK(command_line->HasSwitch(switches::kDisableGpuSandbox) ||
-         in_browser_process_);
-
-  // This is slow, but it's the only thing the unsandboxed GPU process does,
-  // and GpuDataManager prevents us from sending multiple collecting requests,
-  // so it's OK to be blocking.
-  gpu::GetDxDiagnostics(&gpu_info_.dx_diagnostics);
-  gpu_info_.dx_diagnostics_info_state = gpu::kCollectInfoSuccess;
-#endif  // OS_WIN
-
-  Send(new GpuHostMsg_GraphicsInfoCollected(gpu_info_));
-
-#if defined(OS_WIN)
-  if (!in_browser_process_) {
-    // The unsandboxed GPU process fulfilled its duty.  Rest in peace.
-    base::MessageLoop::current()->QuitWhenIdle();
-  }
-#endif  // OS_WIN
-}
-
 void GpuChildThread::OnGpuSwitched() {
   DVLOG(1) << "GPU: GPU has switched";
   // Notify observers in the GPU process.
diff --git a/content/gpu/gpu_child_thread.h b/content/gpu/gpu_child_thread.h
index b2c49f0f..8b627db 100644
--- a/content/gpu/gpu_child_thread.h
+++ b/content/gpu/gpu_child_thread.h
@@ -40,10 +40,6 @@
 class GpuWatchdogThread;
 }
 
-namespace sandbox {
-class TargetServices;
-}
-
 namespace content {
 class GpuServiceFactory;
 
@@ -60,13 +56,13 @@
     std::string header;
     std::string message;
   };
-  typedef std::queue<LogMessage> DeferredMessages;
+  typedef std::vector<LogMessage> DeferredMessages;
 
   GpuChildThread(std::unique_ptr<gpu::GpuWatchdogThread> gpu_watchdog_thread,
                  bool dead_on_arrival,
                  const gpu::GPUInfo& gpu_info,
                  const gpu::GpuFeatureInfo& gpu_feature_info,
-                 const DeferredMessages& deferred_messages,
+                 DeferredMessages deferred_messages,
                  gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory);
 
   GpuChildThread(const InProcessChildThreadParams& params,
@@ -80,11 +76,15 @@
 
   void Init(const base::Time& process_start_time);
 
-  gpu::GpuWatchdogThread* watchdog_thread() {
-    return gpu_service_->watchdog_thread();
-  }
-
  private:
+  GpuChildThread(const ChildThreadImpl::Options& options,
+                 std::unique_ptr<gpu::GpuWatchdogThread> gpu_watchdog_thread,
+                 bool dead_on_arrival,
+                 bool in_browser_process,
+                 const gpu::GPUInfo& gpu_info,
+                 const gpu::GpuFeatureInfo& gpu_feature_info,
+                 gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory);
+
   void CreateGpuMainService(ui::mojom::GpuMainAssociatedRequest request);
 
   // ChildThreadImpl:.
@@ -111,9 +111,6 @@
                                   const std::string& group_name) override;
 
   // Message handlers.
-  void OnCollectGraphicsInfo();
-  void OnSetVideoMemoryWindowCount(uint32_t window_count);
-
   void OnGpuSwitched();
 
   void OnDestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id,
@@ -129,21 +126,12 @@
   // Set this flag to true if a fatal error occurred before we receive the
   // OnInitialize message, in which case we just declare ourselves DOA.
   const bool dead_on_arrival_;
-  base::Time process_start_time_;
-
-#if defined(OS_WIN)
-  // Windows specific client sandbox interface.
-  sandbox::TargetServices* target_services_;
-#endif
-
-  // Information about the GPU, such as device and vendor ID.
-  gpu::GPUInfo gpu_info_;
 
   // Error messages collected in gpu_main() before the thread is created.
   DeferredMessages deferred_messages_;
 
   // Whether the GPU thread is running in the browser process.
-  bool in_browser_process_;
+  const bool in_browser_process_;
 
   // ServiceFactory for service_manager::Service hosting.
   std::unique_ptr<GpuServiceFactory> service_factory_;
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc
index 31fcf7e..b0d3584 100644
--- a/content/gpu/gpu_main.cc
+++ b/content/gpu/gpu_main.cc
@@ -115,7 +115,7 @@
   log.severity = severity;
   log.header = str.substr(0, message_start);
   log.message = str.substr(message_start);
-  deferred_messages.Get().push(std::move(log));
+  deferred_messages.Get().push_back(std::move(log));
   return false;
 }
 
@@ -285,18 +285,14 @@
   GpuProcess gpu_process(io_thread_priority);
   GpuChildThread* child_thread = new GpuChildThread(
       gpu_init.TakeWatchdogThread(), dead_on_arrival, gpu_init.gpu_info(),
-      gpu_init.gpu_feature_info(), deferred_messages.Get(),
+      gpu_init.gpu_feature_info(), std::move(deferred_messages.Get()),
       gpu_memory_buffer_factory.get());
-  while (!deferred_messages.Get().empty())
-    deferred_messages.Get().pop();
+  deferred_messages.Get().clear();
 
   child_thread->Init(start_time);
 
   gpu_process.set_main_thread(child_thread);
 
-  if (child_thread->watchdog_thread())
-    child_thread->watchdog_thread()->AddPowerObserver();
-
 #if defined(OS_ANDROID)
   base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
       tracing::GraphicsMemoryDumpProvider::GetInstance(), "AndroidGraphics",
diff --git a/content/public/android/java/src/org/chromium/content/browser/framehost/RenderFrameHostImpl.java b/content/public/android/java/src/org/chromium/content/browser/framehost/RenderFrameHostImpl.java
index 8a4526a9..3514a2d 100644
--- a/content/public/android/java/src/org/chromium/content/browser/framehost/RenderFrameHostImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/framehost/RenderFrameHostImpl.java
@@ -17,17 +17,19 @@
     private long mNativeRenderFrameHostAndroid;
     // mDelegate can be null.
     final RenderFrameHostDelegate mDelegate;
+    final boolean mIncognito;
 
-    private RenderFrameHostImpl(
-            long nativeRenderFrameHostAndroid, RenderFrameHostDelegate delegate) {
+    private RenderFrameHostImpl(long nativeRenderFrameHostAndroid, RenderFrameHostDelegate delegate,
+            boolean isIncognito) {
         mNativeRenderFrameHostAndroid = nativeRenderFrameHostAndroid;
         mDelegate = delegate;
+        mIncognito = isIncognito;
     }
 
     @CalledByNative
-    private static RenderFrameHostImpl create(
-            long nativeRenderFrameHostAndroid, RenderFrameHostDelegate delegate) {
-        return new RenderFrameHostImpl(nativeRenderFrameHostAndroid, delegate);
+    private static RenderFrameHostImpl create(long nativeRenderFrameHostAndroid,
+            RenderFrameHostDelegate delegate, boolean isIncognito) {
+        return new RenderFrameHostImpl(nativeRenderFrameHostAndroid, delegate, isIncognito);
     }
 
     @CalledByNative
@@ -50,5 +52,16 @@
         return nativeGetLastCommittedURL(mNativeRenderFrameHostAndroid);
     }
 
+    /**
+     * Returns whether we're in incognito mode.
+     *
+     * TODO(timloh): This function shouldn't really be on here. If we end up
+     * needing more logic from the native BrowserContext, we should add a
+     * wrapper for that and move this function there.
+     */
+    public boolean isIncognito() {
+        return mIncognito;
+    }
+
     private native String nativeGetLastCommittedURL(long nativeRenderFrameHostAndroid);
 }
diff --git a/content/public/android/java/src/org/chromium/content/browser/installedapp/InstalledAppProviderFactory.java b/content/public/android/java/src/org/chromium/content/browser/installedapp/InstalledAppProviderFactory.java
index 82bf8be..6eda1a3 100644
--- a/content/public/android/java/src/org/chromium/content/browser/installedapp/InstalledAppProviderFactory.java
+++ b/content/public/android/java/src/org/chromium/content/browser/installedapp/InstalledAppProviderFactory.java
@@ -5,6 +5,7 @@
 package org.chromium.content.browser.installedapp;
 
 import org.chromium.base.ContextUtils;
+import org.chromium.content.browser.framehost.RenderFrameHostImpl;
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.installedapp.mojom.InstalledAppProvider;
 import org.chromium.services.service_manager.InterfaceFactory;
@@ -18,10 +19,10 @@
 
     private static final class FrameUrlDelegateImpl
             implements InstalledAppProviderImpl.FrameUrlDelegate {
-        private final RenderFrameHost mRenderFrameHost;
+        private final RenderFrameHostImpl mRenderFrameHost;
 
         public FrameUrlDelegateImpl(RenderFrameHost renderFrameHost) {
-            mRenderFrameHost = renderFrameHost;
+            mRenderFrameHost = (RenderFrameHostImpl) renderFrameHost;
         }
 
         @Override
@@ -35,6 +36,11 @@
                 throw new AssertionError(e);
             }
         }
+
+        @Override
+        public boolean isIncognito() {
+            return mRenderFrameHost.isIncognito();
+        }
     }
 
     public InstalledAppProviderFactory(RenderFrameHost renderFrameHost) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/installedapp/InstalledAppProviderImpl.java b/content/public/android/java/src/org/chromium/content/browser/installedapp/InstalledAppProviderImpl.java
index fb43531..d07abed0 100644
--- a/content/public/android/java/src/org/chromium/content/browser/installedapp/InstalledAppProviderImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/installedapp/InstalledAppProviderImpl.java
@@ -54,6 +54,11 @@
          * Gets the URL of the current frame. Can return null (if the frame has disappeared).
          */
         public URI getUrl();
+
+        /**
+         * Checks if we're in incognito. If the frame has disappeared this returns true.
+         */
+        public boolean isIncognito();
     }
 
     public InstalledAppProviderImpl(FrameUrlDelegate frameUrlDelegate, Context context) {
@@ -64,6 +69,11 @@
     @Override
     public void filterInstalledApps(
             RelatedApplication[] relatedApps, FilterInstalledAppsResponse callback) {
+        if (mFrameUrlDelegate.isIncognito()) {
+            callback.call(new RelatedApplication[0]);
+            return;
+        }
+
         URI frameUrl = mFrameUrlDelegate.getUrl();
         ArrayList<RelatedApplication> installedApps = new ArrayList<RelatedApplication>();
         PackageManager pm = mContext.getPackageManager();
@@ -79,6 +89,7 @@
                 installedApps.add(app);
             }
         }
+
         RelatedApplication[] installedAppsArray = new RelatedApplication[installedApps.size()];
         installedApps.toArray(installedAppsArray);
         callback.call(installedAppsArray);
diff --git a/content/public/android/junit/src/org/chromium/content/browser/installedapp/InstalledAppProviderTest.java b/content/public/android/junit/src/org/chromium/content/browser/installedapp/InstalledAppProviderTest.java
index 583c868c..5c81447 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/installedapp/InstalledAppProviderTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/installedapp/InstalledAppProviderTest.java
@@ -162,6 +162,7 @@
     private static final class FakeFrameUrlDelegate
             implements InstalledAppProviderImpl.FrameUrlDelegate {
         private URI mFrameUrl;
+        private boolean mIncognito;
 
         public FakeFrameUrlDelegate(String frameUrl) {
             setFrameUrl(frameUrl);
@@ -184,6 +185,15 @@
         public URI getUrl() {
             return mFrameUrl;
         }
+
+        public void setIncognito(boolean incognito) {
+            mIncognito = incognito;
+        }
+
+        @Override
+        public boolean isIncognito() {
+            return mIncognito;
+        }
     }
 
     /**
@@ -246,7 +256,7 @@
      * returned.
      */
     private void verifyInstalledApps(RelatedApplication[] manifestRelatedApps,
-            final RelatedApplication[] expectedInstalledRelatedApps) {
+            RelatedApplication[] expectedInstalledRelatedApps) {
         mInstalledAppProvider.filterInstalledApps(
                 manifestRelatedApps, new InstalledAppProvider.FilterInstalledAppsResponse() {
                     @Override
@@ -290,6 +300,21 @@
     }
 
     /**
+     * Incognito mode with one related Android app.
+     */
+    @Test
+    @Feature({"InstalledApp"})
+    public void testIncognitoWithOneInstalledRelatedApp() {
+        RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
+                createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
+        setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN);
+        RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplication[] {};
+
+        mFrameUrlDelegate.setIncognito(true);
+        verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps);
+    }
+
+    /**
      * No related Android apps.
      *
      * An Android app relates to the web app, but not mutual.
diff --git a/content/public/app/BUILD.gn b/content/public/app/BUILD.gn
index 7ea74d8..782cd3a9 100644
--- a/content/public/app/BUILD.gn
+++ b/content/public/app/BUILD.gn
@@ -179,6 +179,7 @@
   source = "mojo/content_packaged_services_manifest.json"
   packaged_services = [
     "//media/mojo/services:media_manifest",
+    "//services/data_decoder:manifest",
     "//services/device:manifest",
     "//services/shape_detection:manifest",
   ]
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json
index 7cf86d1..c31412e 100644
--- a/content/public/app/mojo/content_browser_manifest.json
+++ b/content/public/app/mojo/content_browser_manifest.json
@@ -54,6 +54,7 @@
         "content_plugin": [ "browser" ],
         "content_renderer": [ "browser" ],
         "content_utility": [ "browser" ],
+        "data_decoder": [ "image_decoder" ],
         "file": [ "file:filesystem", "file:leveldb" ],
         "media": [ "media:media" ],
         "ui": [ "display_output_protection" ],
diff --git a/content/public/browser/browser_ppapi_host.h b/content/public/browser/browser_ppapi_host.h
index 8c6a842..cf79a50 100644
--- a/content/public/browser/browser_ppapi_host.h
+++ b/content/public/browser/browser_ppapi_host.h
@@ -33,17 +33,6 @@
 // lives entirely on the I/O thread.
 class CONTENT_EXPORT BrowserPpapiHost {
  public:
-  struct OnKeepaliveInstanceStruct {
-    int render_process_id;
-    int render_frame_id;
-    GURL document_url;
-  };
-  typedef std::vector<OnKeepaliveInstanceStruct> OnKeepaliveInstanceData;
-  typedef base::Callback<
-      void (const OnKeepaliveInstanceData& instance_data,
-            const base::FilePath& profile_data_directory)>
-      OnKeepaliveCallback;
-
   // Creates a browser host and sets up an out-of-process proxy for an external
   // pepper plugin process.
   static BrowserPpapiHost* CreateExternalPluginProcess(
@@ -91,10 +80,6 @@
   // Get the Document/Plugin URLs for the given PP_Instance.
   virtual GURL GetDocumentURLForInstance(PP_Instance instance) = 0;
   virtual GURL GetPluginURLForInstance(PP_Instance instance) = 0;
-
-  // Sets a callback the BrowserPpapiHost will run when the plugin messages
-  // that it is active.
-  virtual void SetOnKeepaliveCallback(const OnKeepaliveCallback& callback) = 0;
 };
 
 }  // namespace content
diff --git a/content/public/browser/resource_dispatcher_host.h b/content/public/browser/resource_dispatcher_host.h
index c5fe07ed..4838b48 100644
--- a/content/public/browser/resource_dispatcher_host.h
+++ b/content/public/browser/resource_dispatcher_host.h
@@ -22,11 +22,25 @@
 class ResourceContext;
 class ResourceDispatcherHostDelegate;
 
+// This value is returned by header interceptors below, to determine if a
+// request should proceed based on the values of HTTP headers.
+enum class HeaderInterceptorResult {
+  // Allow the request to proceed with the given headers.
+  CONTINUE,
+
+  // Force the request to fail, since the headers were not supported values.
+  FAIL,
+
+  // Force the request to fail and kill the renderer process, since it attempted
+  // to use an illegal header value that could pose a security risk.
+  KILL,
+};
+
 // This callback is invoked when the interceptor finishes processing the
 // header.
-// Parameter 1 is a bool indicating success or failure.
-// Parameter 2 contains the error code in case of failure, else 0.
-typedef base::Callback<void(bool, int)> OnHeaderProcessedCallback;
+// Parameter 1 indicates whether to continue the request, fail it, or kill the
+// renderer process (and fail it).
+typedef base::Callback<void(HeaderInterceptorResult)> OnHeaderProcessedCallback;
 
 // This callback is registered by interceptors who are interested in being
 // notified of certain HTTP headers in outgoing requests. For e.g. Origin.
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index 5dad98b..01620c8a 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -1130,6 +1130,10 @@
   return browser_plugin_guest ? browser_plugin_guest->focused() : false;
 }
 
+RenderWidgetHost* GetMouseLockWidget(WebContents* web_contents) {
+  return static_cast<WebContentsImpl*>(web_contents)->GetMouseLockWidget();
+}
+
 #if defined(USE_AURA)
 void SendRoutedTouchTapSequence(content::WebContents* web_contents,
                                 gfx::Point point) {
@@ -1865,4 +1869,15 @@
     waiter.WaitForEndUpdate();
 }
 
+void PwnMessageHelper::LockMouse(RenderProcessHost* process,
+                                 int routing_id,
+                                 bool user_gesture,
+                                 bool last_unlocked_by_target,
+                                 bool privileged) {
+  IPC::IpcSecurityTestUtil::PwnMessageReceived(
+      process->GetChannel(),
+      ViewHostMsg_LockMouse(routing_id, user_gesture, last_unlocked_by_target,
+                            privileged));
+}
+
 }  // namespace content
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h
index 2d9832d0..ac767bb5 100644
--- a/content/public/test/browser_test_utils.h
+++ b/content/public/test/browser_test_utils.h
@@ -325,6 +325,9 @@
 // false if the WebContents isn't a guest with a BrowserPlugin.
 bool IsWebContentsBrowserPluginFocused(content::WebContents* web_contents);
 
+// Returns the RenderWidgetHost that holds the mouse lock.
+RenderWidgetHost* GetMouseLockWidget(WebContents* web_contents);
+
 #if defined(USE_AURA)
 // The following two methods allow a test to send a touch tap sequence, and
 // a corresponding gesture tap sequence, by sending it to the top-level
@@ -757,6 +760,13 @@
                               std::string blob_uuid,
                               int64_t position);
 
+  // Sends ViewHostMsg_LockMouse
+  static void LockMouse(RenderProcessHost* process,
+                        int routing_id,
+                        bool user_gesture,
+                        bool last_unlocked_by_target,
+                        bool privileged);
+
  private:
   PwnMessageHelper();  // Not instantiable.
 
diff --git a/content/renderer/media_recorder/video_track_recorder.cc b/content/renderer/media_recorder/video_track_recorder.cc
index 3b1b0a5..c18c368 100644
--- a/content/renderer/media_recorder/video_track_recorder.cc
+++ b/content/renderer/media_recorder/video_track_recorder.cc
@@ -30,10 +30,6 @@
 #include "third_party/libyuv/include/libyuv.h"
 #include "ui/gfx/geometry/size.h"
 
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
 #if BUILDFLAG(RTC_USE_H264)
 #include "third_party/openh264/src/codec/api/svc/codec_api.h"
 #include "third_party/openh264/src/codec/api/svc/codec_app_def.h"
@@ -121,12 +117,6 @@
   return;
 #endif
 
-#if defined(OS_WIN)
-  // See https://crbug.com/698441.
-  if (base::win::GetVersion() < base::win::VERSION_WIN10)
-    return;
-#endif
-
   content::RenderThreadImpl* const render_thread_impl =
       content::RenderThreadImpl::current();
   if (!render_thread_impl) {
@@ -1303,6 +1293,11 @@
   DVLOG(3) << __func__ << frame->visible_rect().size().ToString();
   DCHECK(main_render_thread_checker_.CalledOnValidThread());
 
+  // Avoid reinitializing |encoder_| when there are multiple frames sent to the
+  // sink to initialize, https://crbug.com/698441.
+  if (encoder_)
+    return;
+
   MediaStreamVideoSink::DisconnectFromTrack();
 
   const gfx::Size& input_size = frame->visible_rect().size();
diff --git a/content/shell/browser/layout_test/blink_test_controller.cc b/content/shell/browser/layout_test/blink_test_controller.cc
index b9d53c4..e64906e 100644
--- a/content/shell/browser/layout_test/blink_test_controller.cc
+++ b/content/shell/browser/layout_test/blink_test_controller.cc
@@ -16,6 +16,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
@@ -55,6 +56,10 @@
 #include "content/shell/renderer/layout_test/blink_test_helpers.h"
 #include "ui/gfx/codec/png_codec.h"
 
+#if defined(OS_MACOSX)
+#include "base/mac/foundation_util.h"
+#endif
+
 namespace content {
 
 namespace {
@@ -62,6 +67,21 @@
 const int kTestSVGWindowWidthDip = 480;
 const int kTestSVGWindowHeightDip = 360;
 
+base::FilePath GetBuildDirectory() {
+  base::FilePath result;
+  base::PathService::Get(base::DIR_EXE, &result);
+
+#if defined(OS_MACOSX)
+  if (base::mac::AmIBundled()) {
+    // The bundled app executables (Chromium, TestShell, etc) live three
+    // levels down from the build directory, eg:
+    // Chromium.app/Contents/MacOS/Chromium
+    result = result.DirName().DirName().DirName();
+  }
+#endif
+  return result;
+}
+
 }  // namespace
 
 // BlinkTestResultPrinter ----------------------------------------------------
@@ -617,6 +637,7 @@
     params->allow_external_pages = false;
     params->current_working_directory = current_working_directory_;
     params->temp_path = temp_path_;
+    params->build_directory = GetBuildDirectory();
     params->test_url = test_url_;
     params->enable_pixel_dumping = enable_pixel_dumping_;
     params->allow_external_pages =
diff --git a/content/shell/browser/layout_test/layout_test_content_browser_client.cc b/content/shell/browser/layout_test/layout_test_content_browser_client.cc
index f913fdb..d81473f1 100644
--- a/content/shell/browser/layout_test/layout_test_content_browser_client.cc
+++ b/content/shell/browser/layout_test/layout_test_content_browser_client.cc
@@ -132,7 +132,9 @@
     BrowserContext* context,
     StoragePartition* partition,
     const storage::OptionalQuotaSettingsCallback& callback) {
-  callback.Run(storage::GetHardCodedSettings(5 * 1024 * 1024));
+  // The 1GB limit is intended to give a large headroom to tests that need to
+  // build up a large data set and issue many concurrent reads or writes.
+  callback.Run(storage::GetHardCodedSettings(1024 * 1024 * 1024));
 }
 
 PlatformNotificationService*
diff --git a/content/shell/common/layout_test.mojom b/content/shell/common/layout_test.mojom
index c0de4b5..81f9703 100644
--- a/content/shell/common/layout_test.mojom
+++ b/content/shell/common/layout_test.mojom
@@ -15,6 +15,9 @@
   // The temporary directory of the system.
   mojo.common.mojom.FilePath temp_path;
 
+  // The build directory.
+  mojo.common.mojom.FilePath build_directory;
+
   // The URL of the current layout test.
   url.mojom.Url test_url;
 
diff --git a/content/shell/renderer/layout_test/blink_test_runner.cc b/content/shell/renderer/layout_test/blink_test_runner.cc
index 7701e5a..889e297 100644
--- a/content/shell/renderer/layout_test/blink_test_runner.cc
+++ b/content/shell/renderer/layout_test/blink_test_runner.cc
@@ -368,6 +368,19 @@
     return WebURL(GURL(utf8_url));
   }
 
+  const char kGenPrefix[] = "file:///gen/";
+  const int kGenPrefixLen = arraysize(kGenPrefix) - 1;
+
+  // Map "file:///gen/" to "file://<build directory>/gen/".
+  if (!utf8_url.compare(0, kGenPrefixLen, kGenPrefix, kGenPrefixLen)) {
+    base::FilePath gen_directory_path =
+        test_config_->build_directory.Append(FILE_PATH_LITERAL("gen/"));
+    std::string new_url = std::string("file://") +
+                          gen_directory_path.AsUTF8Unsafe() +
+                          utf8_url.substr(kGenPrefixLen);
+    return WebURL(GURL(new_url));
+  }
+
   const char kPrefix[] = "file:///tmp/LayoutTests/";
   const int kPrefixLen = arraysize(kPrefix) - 1;
 
diff --git a/content/utility/BUILD.gn b/content/utility/BUILD.gn
index d7b2630..a589df1 100644
--- a/content/utility/BUILD.gn
+++ b/content/utility/BUILD.gn
@@ -37,6 +37,8 @@
     "//mojo/public/cpp/bindings",
     "//ppapi/features",
     "//sandbox",
+    "//services/data_decoder:lib",
+    "//services/data_decoder/public/cpp",
     "//services/service_manager",
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/interfaces",
diff --git a/content/utility/DEPS b/content/utility/DEPS
index 6569bcd..74ac29f 100644
--- a/content/utility/DEPS
+++ b/content/utility/DEPS
@@ -2,6 +2,7 @@
   "+components/scheduler/child",
   "+content/child",
   "+content/public/utility",
+  "+services/data_decoder",
   "+services/service_manager",
   "+services/service_manager",
   "+services/shape_detection",
diff --git a/content/utility/utility_service_factory.cc b/content/utility/utility_service_factory.cc
index e70647c..9a28ba4 100644
--- a/content/utility/utility_service_factory.cc
+++ b/content/utility/utility_service_factory.cc
@@ -9,6 +9,8 @@
 #include "content/public/utility/content_utility_client.h"
 #include "content/public/utility/utility_thread.h"
 #include "content/utility/utility_thread_impl.h"
+#include "services/data_decoder/data_decoder_service.h"
+#include "services/data_decoder/public/interfaces/constants.mojom.h"
 #include "services/shape_detection/public/interfaces/constants.mojom.h"
 #include "services/shape_detection/shape_detection_service.h"
 
@@ -18,6 +20,15 @@
 
 namespace content {
 
+namespace {
+
+std::unique_ptr<service_manager::Service> CreateDataDecoderService() {
+  content::UtilityThread::Get()->EnsureBlinkInitialized();
+  return data_decoder::DataDecoderService::Create();
+}
+
+}  // namespace
+
 UtilityServiceFactory::UtilityServiceFactory() {}
 
 UtilityServiceFactory::~UtilityServiceFactory() {}
@@ -35,6 +46,11 @@
       base::Bind(&shape_detection::ShapeDetectionService::Create);
   services->insert(std::make_pair(shape_detection::mojom::kServiceName,
                                   shape_detection_info));
+
+  ServiceInfo data_decoder_info;
+  data_decoder_info.factory = base::Bind(&CreateDataDecoderService);
+  services->insert(
+      std::make_pair(data_decoder::mojom::kServiceName, data_decoder_info));
 }
 
 void UtilityServiceFactory::OnServiceQuit() {
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 3d5bc42..b25bff3 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1227,6 +1227,7 @@
   NETWORKINGCASTPRIVATE_VERIFYANDENCRYPTDATA,
   NETWORKINGCASTPRIVATE_SETWIFITDLSENABLEDSTATE,
   NETWORKINGCASTPRIVATE_GETWIFITDLSSTATUS,
+  ACCESSIBILITY_PRIVATE_DARKENSCREEN,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/preload_check_test_util.cc b/extensions/browser/preload_check_test_util.cc
index b12bc179..f5becf43 100644
--- a/extensions/browser/preload_check_test_util.cc
+++ b/extensions/browser/preload_check_test_util.cc
@@ -9,10 +9,14 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
+#include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "extensions/common/extension.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace extensions {
 
+// PreloadCheckRunner:
 PreloadCheckRunner::PreloadCheckRunner() : called_(false) {}
 PreloadCheckRunner::~PreloadCheckRunner() {}
 
@@ -47,4 +51,36 @@
   run_loop_->RunUntilIdle();
 }
 
+// PreloadCheckStub:
+PreloadCheckStub::PreloadCheckStub()
+    : PreloadCheck(nullptr), is_async_(false), weak_ptr_factory_(this) {}
+
+PreloadCheckStub::~PreloadCheckStub() {}
+
+void PreloadCheckStub::AddError(Error error) {
+  errors_.insert(error);
+}
+
+void PreloadCheckStub::Start(ResultCallback callback) {
+  DCHECK(!callback.is_null());
+  if (is_async_) {
+    // TODO(michaelpg): Bind the callback directly and remove RunCallback
+    // once crbug.com/704027 is addressed.
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::Bind(&PreloadCheckStub::RunCallback,
+                   weak_ptr_factory_.GetWeakPtr(), base::Passed(&callback)));
+  } else {
+    std::move(callback).Run(errors_);
+  }
+}
+
+void PreloadCheckStub::RunCallback(ResultCallback callback) {
+  std::move(callback).Run(errors_);
+}
+
+base::string16 PreloadCheckStub::GetErrorMessage() const {
+  return message_;
+}
+
 }  // namespace extensions
diff --git a/extensions/browser/preload_check_test_util.h b/extensions/browser/preload_check_test_util.h
index 7da768a..3ef1fd9 100644
--- a/extensions/browser/preload_check_test_util.h
+++ b/extensions/browser/preload_check_test_util.h
@@ -7,6 +7,9 @@
 
 #include <memory>
 
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/strings/string16.h"
 #include "extensions/browser/preload_check.h"
 
 namespace base {
@@ -51,6 +54,34 @@
   DISALLOW_COPY_AND_ASSIGN(PreloadCheckRunner);
 };
 
+// Stub for a PreloadCheck that returns the desired error(s).
+class PreloadCheckStub : public PreloadCheck {
+ public:
+  PreloadCheckStub();
+  ~PreloadCheckStub() override;
+
+  void AddError(Error error);
+  void set_error_message(const base::string16& message) { message_ = message; }
+
+  bool is_async() const { return is_async_; }
+  void set_is_async(bool is_async) { is_async_ = is_async; }
+
+  // PreloadCheck:
+  void Start(ResultCallback callback) override;
+  base::string16 GetErrorMessage() const override;
+
+ private:
+  void RunCallback(ResultCallback callback);
+
+  bool is_async_ = false;
+  Errors errors_;
+  base::string16 message_;
+
+  base::WeakPtrFactory<PreloadCheckStub> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(PreloadCheckStub);
+};
+
 }  // namespace extensions
 
 #endif  // EXTENSIONS_BROWSER_PRELOAD_CHECK_TEST_UTIL_H_
diff --git a/extensions/browser/process_manager.cc b/extensions/browser/process_manager.cc
index 9af62f4..da355fc 100644
--- a/extensions/browser/process_manager.cc
+++ b/extensions/browser/process_manager.cc
@@ -48,8 +48,6 @@
 
 // The time to delay between an extension becoming idle and
 // sending a ShouldSuspend message.
-// Note: Must be sufficiently larger (e.g. 2x) than
-// kKeepaliveThrottleIntervalInSeconds in ppapi/proxy/plugin_globals.
 unsigned g_event_page_idle_time_msec = 10000;
 
 // The time to delay between sending a ShouldSuspend message and
@@ -120,46 +118,32 @@
 
 struct ProcessManager::BackgroundPageData {
   // The count of things keeping the lazy background page alive.
-  int lazy_keepalive_count;
-
-  // Tracks if an impulse event has occured since the last polling check.
-  bool keepalive_impulse;
-  bool previous_keepalive_impulse;
+  int lazy_keepalive_count = 0;
 
   // True if the page responded to the ShouldSuspend message and is currently
   // dispatching the suspend event. During this time any events that arrive will
   // cancel the suspend process and an onSuspendCanceled event will be
   // dispatched to the page.
-  bool is_closing;
+  bool is_closing = false;
 
   // Stores the value of the incremented
   // ProcessManager::last_background_close_sequence_id_ whenever the extension
   // is active. A copy of the ID is also passed in the callbacks and IPC
   // messages leading up to CloseLazyBackgroundPageNow. The process is aborted
   // if the IDs ever differ due to new activity.
-  uint64_t close_sequence_id;
+  uint64_t close_sequence_id = 0ull;
 
   // Keeps track of when this page was last suspended. Used for perf metrics.
   std::unique_ptr<base::ElapsedTimer> since_suspended;
-
-  BackgroundPageData()
-      : lazy_keepalive_count(0),
-        keepalive_impulse(false),
-        previous_keepalive_impulse(false),
-        is_closing(false),
-        close_sequence_id(0) {}
 };
 
 // Data of a RenderFrameHost associated with an extension.
 struct ProcessManager::ExtensionRenderFrameData {
   // The type of the view.
-  extensions::ViewType view_type;
+  extensions::ViewType view_type = VIEW_TYPE_INVALID;
 
   // Whether the view is keeping the lazy background page alive or not.
-  bool has_keepalive;
-
-  ExtensionRenderFrameData()
-      : view_type(VIEW_TYPE_INVALID), has_keepalive(false) {}
+  bool has_keepalive = false;
 
   // Returns whether the view can keep the lazy background page alive or not.
   bool CanKeepalive() const {
@@ -262,8 +246,6 @@
                  extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE,
                  content::Source<BrowserContext>(context));
   content::DevToolsAgentHost::AddObserver(this);
-
-  OnKeepaliveImpulseCheck();
 }
 
 ProcessManager::~ProcessManager() = default;
@@ -495,52 +477,6 @@
     DecrementLazyKeepaliveCount(extension->id());
 }
 
-// This implementation layers on top of the keepalive count. An impulse sets
-// a per extension flag. On a regular interval that flag is checked. Changes
-// from the flag not being set to set cause an IncrementLazyKeepaliveCount.
-void ProcessManager::KeepaliveImpulse(const Extension* extension) {
-  if (!BackgroundInfo::HasLazyBackgroundPage(extension))
-    return;
-
-  BackgroundPageData& bd = background_page_data_[extension->id()];
-
-  if (!bd.keepalive_impulse) {
-    bd.keepalive_impulse = true;
-    if (!bd.previous_keepalive_impulse) {
-      IncrementLazyKeepaliveCount(extension);
-    }
-  }
-
-  if (!keepalive_impulse_callback_for_testing_.is_null()) {
-    ImpulseCallbackForTesting callback_may_clear_callbacks_reentrantly =
-      keepalive_impulse_callback_for_testing_;
-    callback_may_clear_callbacks_reentrantly.Run(extension->id());
-  }
-}
-
-// static
-void ProcessManager::OnKeepaliveFromPlugin(int render_process_id,
-                                           int render_frame_id,
-                                           const std::string& extension_id) {
-  content::RenderFrameHost* render_frame_host =
-      content::RenderFrameHost::FromID(render_process_id, render_frame_id);
-  if (!render_frame_host)
-    return;
-
-  content::SiteInstance* site_instance = render_frame_host->GetSiteInstance();
-  if (!site_instance)
-    return;
-
-  BrowserContext* browser_context = site_instance->GetBrowserContext();
-  const Extension* extension =
-      ExtensionRegistry::Get(browser_context)->enabled_extensions().GetByID(
-          extension_id);
-  if (!extension)
-    return;
-
-  ProcessManager::Get(browser_context)->KeepaliveImpulse(extension);
-}
-
 void ProcessManager::OnShouldSuspendAck(const std::string& extension_id,
                                         uint64_t sequence_id) {
   ExtensionHost* host = GetBackgroundHostForExtension(extension_id);
@@ -630,19 +566,9 @@
   DCHECK(background_hosts_.empty());
 }
 
-void ProcessManager::SetKeepaliveImpulseCallbackForTesting(
-    const ImpulseCallbackForTesting& callback) {
-  keepalive_impulse_callback_for_testing_ = callback;
-}
-
-void ProcessManager::SetKeepaliveImpulseDecrementCallbackForTesting(
-    const ImpulseCallbackForTesting& callback) {
-  keepalive_impulse_decrement_callback_for_testing_ = callback;
-}
-
 // static
 void ProcessManager::SetEventPageIdleTimeForTesting(unsigned idle_time_msec) {
-  CHECK_GT(idle_time_msec, 0u);  // OnKeepaliveImpulseCheck requires non zero.
+  CHECK_GT(idle_time_msec, 0u);
   g_event_page_idle_time_msec = idle_time_msec;
 }
 
@@ -800,41 +726,6 @@
   }
 }
 
-// DecrementLazyKeepaliveCount is called when no calls to KeepaliveImpulse
-// have been made for at least g_event_page_idle_time_msec. In the best case an
-// impulse was made just before being cleared, and the decrement will occur
-// g_event_page_idle_time_msec later, causing a 2 * g_event_page_idle_time_msec
-// total time for extension to be shut down based on impulses. Worst case is
-// an impulse just after a clear, adding one check cycle and resulting in 3x
-// total time.
-void ProcessManager::OnKeepaliveImpulseCheck() {
-  for (BackgroundPageDataMap::iterator i = background_page_data_.begin();
-       i != background_page_data_.end();
-       ++i) {
-    if (i->second.previous_keepalive_impulse && !i->second.keepalive_impulse) {
-      DecrementLazyKeepaliveCount(i->first);
-      if (!keepalive_impulse_decrement_callback_for_testing_.is_null()) {
-        ImpulseCallbackForTesting callback_may_clear_callbacks_reentrantly =
-            keepalive_impulse_decrement_callback_for_testing_;
-        callback_may_clear_callbacks_reentrantly.Run(i->first);
-      }
-    }
-
-    i->second.previous_keepalive_impulse = i->second.keepalive_impulse;
-    i->second.keepalive_impulse = false;
-  }
-
-  // OnKeepaliveImpulseCheck() is always called in constructor, but in unit
-  // tests there will be no thread task runner handle. In that event don't
-  // schedule tasks.
-  if (base::ThreadTaskRunnerHandle::IsSet()) {
-    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, base::Bind(&ProcessManager::OnKeepaliveImpulseCheck,
-                              weak_ptr_factory_.GetWeakPtr()),
-        base::TimeDelta::FromMilliseconds(g_event_page_idle_time_msec));
-  }
-}
-
 void ProcessManager::OnLazyBackgroundPageIdle(const std::string& extension_id,
                                               uint64_t sequence_id) {
   ExtensionHost* host = GetBackgroundHostForExtension(extension_id);
diff --git a/extensions/browser/process_manager.h b/extensions/browser/process_manager.h
index 1569553..7d6e422 100644
--- a/extensions/browser/process_manager.h
+++ b/extensions/browser/process_manager.h
@@ -125,16 +125,6 @@
   void IncrementLazyKeepaliveCount(const Extension* extension);
   void DecrementLazyKeepaliveCount(const Extension* extension);
 
-  // Keeps a background page alive. Unlike IncrementLazyKeepaliveCount, these
-  // impulses will only keep the page alive for a limited amount of time unless
-  // called regularly.
-  void KeepaliveImpulse(const Extension* extension);
-
-  // Triggers a keepalive impulse for a plugin (e.g NaCl).
-  static void OnKeepaliveFromPlugin(int render_process_id,
-                                    int render_frame_id,
-                                    const std::string& extension_id);
-
   // Handles a response to the ShouldSuspend message, used for lazy background
   // pages.
   void OnShouldSuspendAck(const std::string& extension_id,
@@ -157,14 +147,6 @@
   // Called on shutdown to close our extension hosts.
   void CloseBackgroundHosts();
 
-  // Sets callbacks for testing keepalive impulse behavior.
-  using ImpulseCallbackForTesting =
-      base::Callback<void(const std::string& extension_id)>;
-  void SetKeepaliveImpulseCallbackForTesting(
-      const ImpulseCallbackForTesting& callback);
-  void SetKeepaliveImpulseDecrementCallbackForTesting(
-      const ImpulseCallbackForTesting& callback);
-
   // EventPageTracker implementation.
   bool IsEventPageSuspended(const std::string& extension_id) override;
   bool WakeEventPage(const std::string& extension_id,
@@ -262,9 +244,6 @@
   // |extension_id| known to have a lazy background page.
   void DecrementLazyKeepaliveCount(const std::string& extension_id);
 
-  // Checks if keepalive impulses have occured, and adjusts keep alive count.
-  void OnKeepaliveImpulseCheck();
-
   // These are called when the extension transitions between idle and active.
   // They control the process of closing the background page when idle.
   void OnLazyBackgroundPageIdle(const std::string& extension_id,
@@ -312,9 +291,6 @@
   // True if we have created the startup set of background hosts.
   bool startup_background_hosts_created_;
 
-  ImpulseCallbackForTesting keepalive_impulse_callback_for_testing_;
-  ImpulseCallbackForTesting keepalive_impulse_decrement_callback_for_testing_;
-
   base::ObserverList<ProcessManagerObserver> observer_list_;
 
   // ID Counter used to set ProcessManager::BackgroundPageData close_sequence_id
diff --git a/extensions/renderer/resources/web_request_internal_custom_bindings.js b/extensions/renderer/resources/web_request_internal_custom_bindings.js
index 3c74a67..e55205f 100644
--- a/extensions/renderer/resources/web_request_internal_custom_bindings.js
+++ b/extensions/renderer/resources/web_request_internal_custom_bindings.js
@@ -5,11 +5,12 @@
 // Custom binding for the webRequestInternal API.
 
 var binding = require('binding').Binding.create('webRequestInternal');
+var CHECK = requireNative('logging').CHECK;
 var eventBindings = require('event_bindings');
-var sendRequest = require('sendRequest').sendRequest;
-var validate = require('schemaUtils').validate;
-var utils = require('utils');
 var idGeneratorNatives = requireNative('id_generator');
+var sendRequest = require('sendRequest').sendRequest;
+var utils = require('utils');
+var validate = require('schemaUtils').validate;
 
 var webRequestInternal;
 
@@ -38,25 +39,19 @@
   this.webViewInstanceId = opt_webViewInstanceId || 0;
   this.subEvents = [];
   this.eventOptions = eventBindings.parseEventOptions(opt_eventOptions);
-  if (this.eventOptions.supportsRules) {
-    this.eventForRules =
-        new eventBindings.Event(eventName, opt_argSchemas, opt_eventOptions,
-                                opt_webViewInstanceId);
-  }
+  CHECK(!this.eventOptions.supportsRules, eventName + ' supports rules');
+  CHECK(this.eventOptions.supportsListeners,
+        eventName + ' does not support listeners');
 }
 $Object.setPrototypeOf(WebRequestEventImpl.prototype, null);
 
 // Test if the given callback is registered for this event.
 WebRequestEventImpl.prototype.hasListener = function(cb) {
-  if (!this.eventOptions.supportsListeners)
-    throw new Error('This event does not support listeners.');
   return this.findListener_(cb) > -1;
 };
 
 // Test if any callbacks are registered fur thus event.
 WebRequestEventImpl.prototype.hasListeners = function() {
-  if (!this.eventOptions.supportsListeners)
-    throw new Error('This event does not support listeners.');
   return this.subEvents.length > 0;
 };
 
@@ -66,8 +61,6 @@
 // info is sent to the callback.
 WebRequestEventImpl.prototype.addListener =
     function(cb, opt_filter, opt_extraInfo) {
-  if (!this.eventOptions.supportsListeners)
-    throw new Error('This event does not support listeners.');
   // NOTE(benjhayden) New APIs should not use this subEventName trick! It does
   // not play well with event pages. See downloads.onDeterminingFilename and
   // ExtensionDownloadsEventRouter for an alternative approach.
@@ -114,8 +107,6 @@
 
 // Unregisters a callback.
 WebRequestEventImpl.prototype.removeListener = function(cb) {
-  if (!this.eventOptions.supportsListeners)
-    throw new Error('This event does not support listeners.');
   var idx;
   while ((idx = this.findListener_(cb)) >= 0) {
     var e = this.subEvents[idx];
@@ -142,22 +133,16 @@
 };
 
 WebRequestEventImpl.prototype.addRules = function(rules, opt_cb) {
-  if (!this.eventOptions.supportsRules)
-    throw new Error('This event does not support rules.');
-  this.eventForRules.addRules(rules, opt_cb);
+  throw new Error('This event does not support rules.');
 };
 
 WebRequestEventImpl.prototype.removeRules =
     function(ruleIdentifiers, opt_cb) {
-  if (!this.eventOptions.supportsRules)
-    throw new Error('This event does not support rules.');
-  this.eventForRules.removeRules(ruleIdentifiers, opt_cb);
+  throw new Error('This event does not support rules.');
 };
 
 WebRequestEventImpl.prototype.getRules = function(ruleIdentifiers, cb) {
-  if (!this.eventOptions.supportsRules)
-    throw new Error('This event does not support rules.');
-  this.eventForRules.getRules(ruleIdentifiers, cb);
+  throw new Error('This event does not support rules.');
 };
 
 binding.registerCustomHook(function(api) {
diff --git a/extensions/shell/browser/shell_nacl_browser_delegate.cc b/extensions/shell/browser/shell_nacl_browser_delegate.cc
index 88db0fd..303dcad 100644
--- a/extensions/shell/browser/shell_nacl_browser_delegate.cc
+++ b/extensions/shell/browser/shell_nacl_browser_delegate.cc
@@ -30,39 +30,6 @@
 using content::BrowserPpapiHost;
 
 namespace extensions {
-namespace {
-
-// Handles an extension's NaCl process transitioning in or out of idle state by
-// relaying the state to the extension's process manager. See Chrome's
-// NaClBrowserDelegateImpl for another example.
-void OnKeepaliveOnUIThread(
-    const BrowserPpapiHost::OnKeepaliveInstanceData& instance_data,
-    const base::FilePath& profile_data_directory) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  // Only one instance will exist for NaCl embeds, even when more than one
-  // embed of the same plugin exists on the same page.
-  DCHECK(instance_data.size() == 1);
-  if (instance_data.size() < 1)
-    return;
-
-  ProcessManager::OnKeepaliveFromPlugin(instance_data[0].render_process_id,
-                                        instance_data[0].render_frame_id,
-                                        instance_data[0].document_url.host());
-}
-
-// Calls OnKeepaliveOnUIThread on UI thread.
-void OnKeepalive(const BrowserPpapiHost::OnKeepaliveInstanceData& instance_data,
-                 const base::FilePath& profile_data_directory) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(
-          &OnKeepaliveOnUIThread, instance_data, profile_data_directory));
-}
-
-}  // namespace
 
 ShellNaClBrowserDelegate::ShellNaClBrowserDelegate(BrowserContext* context)
     : browser_context_(context) {
@@ -182,11 +149,6 @@
   return true;
 }
 
-content::BrowserPpapiHost::OnKeepaliveCallback
-ShellNaClBrowserDelegate::GetOnKeepaliveCallback() {
-  return base::Bind(&OnKeepalive);
-}
-
 bool ShellNaClBrowserDelegate::IsNonSfiModeAllowed(
     const base::FilePath& profile_directory,
     const GURL& manifest_url) {
diff --git a/extensions/shell/browser/shell_nacl_browser_delegate.h b/extensions/shell/browser/shell_nacl_browser_delegate.h
index a0f0a387..80907be 100644
--- a/extensions/shell/browser/shell_nacl_browser_delegate.h
+++ b/extensions/shell/browser/shell_nacl_browser_delegate.h
@@ -41,8 +41,6 @@
                              base::FilePath* file_path) override;
   void SetDebugPatterns(const std::string& debug_patterns) override;
   bool URLMatchesDebugPatterns(const GURL& manifest_url) override;
-  content::BrowserPpapiHost::OnKeepaliveCallback GetOnKeepaliveCallback()
-      override;
   bool IsNonSfiModeAllowed(const base::FilePath& profile_directory,
                            const GURL& manifest_url) override;
 
diff --git a/headless/lib/browser/devtools_api/domain_h.template b/headless/lib/browser/devtools_api/domain_h.template
index 50073c0..50c7c049 100644
--- a/headless/lib/browser/devtools_api/domain_h.template
+++ b/headless/lib/browser/devtools_api/domain_h.template
@@ -50,8 +50,8 @@
 
 namespace headless {
 namespace {{domain.domain | camelcase_to_hacker_style}} {
-class ExperimentalDomain;
-class ExperimentalObserver;
+class HEADLESS_EXPORT ExperimentalDomain;
+class HEADLESS_EXPORT ExperimentalObserver;
 {% if "events" in domain %}
 
 class HEADLESS_EXPORT ExperimentalObserver {
diff --git a/headless/lib/browser/headless_browser_impl.h b/headless/lib/browser/headless_browser_impl.h
index 864e49c..d54ecfd7 100644
--- a/headless/lib/browser/headless_browser_impl.h
+++ b/headless/lib/browser/headless_browser_impl.h
@@ -16,6 +16,7 @@
 #include "content/public/browser/web_contents.h"
 #include "headless/lib/browser/headless_devtools_manager_delegate.h"
 #include "headless/lib/browser/headless_web_contents_impl.h"
+#include "headless/public/headless_export.h"
 
 #if defined(USE_AURA)
 #include "headless/lib/browser/headless_window_tree_host.h"
@@ -32,7 +33,8 @@
 class HeadlessBrowserContextImpl;
 class HeadlessBrowserMainParts;
 
-class HeadlessBrowserImpl : public HeadlessBrowser {
+// Exported for tests.
+class HEADLESS_EXPORT HeadlessBrowserImpl : public HeadlessBrowser {
  public:
   HeadlessBrowserImpl(
       const base::Callback<void(HeadlessBrowser*)>& on_start_callback,
diff --git a/headless/lib/browser/headless_web_contents_impl.h b/headless/lib/browser/headless_web_contents_impl.h
index 3346c64..c966fca3 100644
--- a/headless/lib/browser/headless_web_contents_impl.h
+++ b/headless/lib/browser/headless_web_contents_impl.h
@@ -13,6 +13,7 @@
 #include "content/public/browser/render_process_host_observer.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "headless/public/headless_devtools_target.h"
+#include "headless/public/headless_export.h"
 #include "headless/public/headless_web_contents.h"
 
 namespace content {
@@ -28,10 +29,12 @@
 class HeadlessBrowserImpl;
 class WebContentsObserverAdapter;
 
-class HeadlessWebContentsImpl : public HeadlessWebContents,
-                                public HeadlessDevToolsTarget,
-                                public content::RenderProcessHostObserver,
-                                public content::WebContentsObserver {
+// Exported for tests.
+class HEADLESS_EXPORT HeadlessWebContentsImpl
+    : public HeadlessWebContents,
+      public HeadlessDevToolsTarget,
+      public content::RenderProcessHostObserver,
+      public content::WebContentsObserver {
  public:
   ~HeadlessWebContentsImpl() override;
 
diff --git a/headless/lib/headless_content_main_delegate.h b/headless/lib/headless_content_main_delegate.h
index cb33f22..0f5c61e8 100644
--- a/headless/lib/headless_content_main_delegate.h
+++ b/headless/lib/headless_content_main_delegate.h
@@ -13,6 +13,7 @@
 #include "content/public/app/content_main_delegate.h"
 #include "headless/lib/browser/headless_platform_event_source.h"
 #include "headless/lib/headless_content_client.h"
+#include "headless/public/headless_export.h"
 
 namespace base {
 class CommandLine;
@@ -23,7 +24,9 @@
 class HeadlessBrowserImpl;
 class HeadlessContentBrowserClient;
 
-class HeadlessContentMainDelegate : public content::ContentMainDelegate {
+// Exported for tests.
+class HEADLESS_EXPORT HeadlessContentMainDelegate
+    : public content::ContentMainDelegate {
  public:
   explicit HeadlessContentMainDelegate(
       std::unique_ptr<HeadlessBrowserImpl> browser);
diff --git a/headless/public/headless_web_contents.h b/headless/public/headless_web_contents.h
index 74dc4df..70c92abf 100644
--- a/headless/public/headless_web_contents.h
+++ b/headless/public/headless_web_contents.h
@@ -26,11 +26,11 @@
 // main thread.
 class HEADLESS_EXPORT HeadlessWebContents {
  public:
-  class Builder;
+  class HEADLESS_EXPORT Builder;
 
   virtual ~HeadlessWebContents() {}
 
-  class Observer {
+  class HEADLESS_EXPORT Observer {
    public:
     // All the following notifications will be called on browser main thread.
 
diff --git a/headless/public/util/deterministic_dispatcher.h b/headless/public/util/deterministic_dispatcher.h
index 56c7c7e6..8828198 100644
--- a/headless/public/util/deterministic_dispatcher.h
+++ b/headless/public/util/deterministic_dispatcher.h
@@ -13,6 +13,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/lock.h"
+#include "headless/public/headless_export.h"
 #include "headless/public/util/url_request_dispatcher.h"
 #include "net/base/net_errors.h"
 
@@ -23,7 +24,7 @@
 // The purpose of this class is to queue up navigations and calls to
 // OnHeadersComplete / OnStartError and dispatch them in order of creation. This
 // helps make renders deterministic at the cost of slower page loads.
-class DeterministicDispatcher : public URLRequestDispatcher {
+class HEADLESS_EXPORT DeterministicDispatcher : public URLRequestDispatcher {
  public:
   explicit DeterministicDispatcher(
       scoped_refptr<base::SingleThreadTaskRunner> io_thread_task_runner);
diff --git a/headless/public/util/deterministic_http_protocol_handler.h b/headless/public/util/deterministic_http_protocol_handler.h
index 89d76cb..05d5215 100644
--- a/headless/public/util/deterministic_http_protocol_handler.h
+++ b/headless/public/util/deterministic_http_protocol_handler.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/single_thread_task_runner.h"
+#include "headless/public/headless_export.h"
 #include "net/url_request/url_request_job_factory.h"
 
 namespace net {
@@ -22,7 +23,7 @@
 // will return in order of creation, regardless of what order the network
 // returns them in.  This helps remove one large source of network related
 // non determinism at the cost of slower page loads.
-class DeterministicHttpProtocolHandler
+class HEADLESS_EXPORT DeterministicHttpProtocolHandler
     : public net::URLRequestJobFactory::ProtocolHandler {
  public:
   // Note |deterministic_dispatcher| is expected to be shared across a number of
diff --git a/headless/public/util/dom_tree_extractor.h b/headless/public/util/dom_tree_extractor.h
index 1ba9bf3..081e4ba 100644
--- a/headless/public/util/dom_tree_extractor.h
+++ b/headless/public/util/dom_tree_extractor.h
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "headless/public/devtools/domains/css.h"
 #include "headless/public/devtools/domains/dom.h"
+#include "headless/public/headless_export.h"
 
 namespace headless {
 class HeadlessDevToolsClient;
@@ -20,7 +21,7 @@
 // exact layout should not be regarded as stable, it's subject to change without
 // notice).
 // TODO(alexclarke): Remove in favor of one using DOM.getFlattenedDocument.
-class DomTreeExtractor {
+class HEADLESS_EXPORT DomTreeExtractor {
  public:
   explicit DomTreeExtractor(HeadlessDevToolsClient* devtools_client);
   ~DomTreeExtractor();
@@ -28,7 +29,7 @@
   using NodeId = int;
   using Index = size_t;
 
-  class DomTree {
+  class HEADLESS_EXPORT DomTree {
    public:
     DomTree();
     DomTree(DomTree&& other);
diff --git a/headless/public/util/expedited_dispatcher.h b/headless/public/util/expedited_dispatcher.h
index 61062c4..80579d2d 100644
--- a/headless/public/util/expedited_dispatcher.h
+++ b/headless/public/util/expedited_dispatcher.h
@@ -8,6 +8,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/single_thread_task_runner.h"
+#include "headless/public/headless_export.h"
 #include "headless/public/util/url_request_dispatcher.h"
 #include "net/base/net_errors.h"
 
@@ -17,7 +18,7 @@
 
 // This class dispatches calls to OnHeadersComplete and OnStartError
 // immediately sacrificing determinism for performance.
-class ExpeditedDispatcher : public URLRequestDispatcher {
+class HEADLESS_EXPORT ExpeditedDispatcher : public URLRequestDispatcher {
  public:
   explicit ExpeditedDispatcher(
       scoped_refptr<base::SingleThreadTaskRunner> io_thread_task_runner);
diff --git a/headless/public/util/flat_dom_tree_extractor.h b/headless/public/util/flat_dom_tree_extractor.h
index 14de70d..867c4594 100644
--- a/headless/public/util/flat_dom_tree_extractor.h
+++ b/headless/public/util/flat_dom_tree_extractor.h
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "headless/public/devtools/domains/css.h"
 #include "headless/public/devtools/domains/dom.h"
+#include "headless/public/headless_export.h"
 
 namespace headless {
 class HeadlessDevToolsClient;
@@ -19,7 +20,7 @@
 // addition, it also extracts details of bounding boxes and layout text (NB the
 // exact layout should not be regarded as stable, it's subject to change without
 // notice).
-class FlatDomTreeExtractor {
+class HEADLESS_EXPORT FlatDomTreeExtractor {
  public:
   explicit FlatDomTreeExtractor(HeadlessDevToolsClient* devtools_client);
   ~FlatDomTreeExtractor();
@@ -27,7 +28,7 @@
   using NodeId = int;
   using Index = size_t;
 
-  class DomTree {
+  class HEADLESS_EXPORT DomTree {
    public:
     DomTree();
     DomTree(DomTree&& other);
diff --git a/headless/public/util/generic_url_request_job.h b/headless/public/util/generic_url_request_job.h
index 751f497c..5cb7733e 100644
--- a/headless/public/util/generic_url_request_job.h
+++ b/headless/public/util/generic_url_request_job.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "headless/public/headless_export.h"
 #include "headless/public/util/managed_dispatch_url_request_job.h"
 #include "headless/public/util/url_fetcher.h"
 #include "net/base/net_errors.h"
@@ -34,8 +35,9 @@
 // 1. The delegate can extension observe / cancel and redirect requests
 // 2. The delegate can optionally provide the results, otherwise the specifed
 //    fetcher is invoked.
-class GenericURLRequestJob : public ManagedDispatchURLRequestJob,
-                             public URLFetcher::ResultListener {
+class HEADLESS_EXPORT GenericURLRequestJob
+    : public ManagedDispatchURLRequestJob,
+      public URLFetcher::ResultListener {
  public:
   enum class RewriteResult { kAllow, kDeny, kFailure };
   using RewriteCallback = std::function<
@@ -51,7 +53,7 @@
     size_t response_data_size;
   };
 
-  class Delegate {
+  class HEADLESS_EXPORT Delegate {
    public:
     // Allows the delegate to rewrite the URL for a given request. Return true
     // to signal that the rewrite is in progress and |callback| will be called
diff --git a/headless/public/util/managed_dispatch_url_request_job.h b/headless/public/util/managed_dispatch_url_request_job.h
index 3903d2a..c76e9432 100644
--- a/headless/public/util/managed_dispatch_url_request_job.h
+++ b/headless/public/util/managed_dispatch_url_request_job.h
@@ -6,6 +6,7 @@
 #define HEADLESS_PUBLIC_UTIL_MANAGED_DISPATCH_URL_REQUEST_JOB_H_
 
 #include "base/macros.h"
+#include "headless/public/headless_export.h"
 #include "net/base/net_errors.h"
 #include "net/url_request/url_request.h"
 #include "net/url_request/url_request_job.h"
@@ -17,7 +18,7 @@
 // the order in which a set of fetches complete. Typically this is done to make
 // fetching deterministic. NOTE URLRequestDispatcher sub classes use
 // OnHeadersComplete and OnStartError to drive the URLRequestJob.
-class ManagedDispatchURLRequestJob : public net::URLRequestJob {
+class HEADLESS_EXPORT ManagedDispatchURLRequestJob : public net::URLRequestJob {
  public:
   ManagedDispatchURLRequestJob(net::URLRequest* request,
                                net::NetworkDelegate* network_delegate,
diff --git a/headless/public/util/testing/generic_url_request_mocks.h b/headless/public/util/testing/generic_url_request_mocks.h
index 8483e56..177c3b1 100644
--- a/headless/public/util/testing/generic_url_request_mocks.h
+++ b/headless/public/util/testing/generic_url_request_mocks.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/macros.h"
+#include "headless/public/headless_export.h"
 #include "headless/public/util/generic_url_request_job.h"
 #include "headless/public/util/testing/generic_url_request_mocks.h"
 #include "net/cookies/cookie_store.h"
@@ -18,7 +19,8 @@
 
 namespace headless {
 
-class MockGenericURLRequestJobDelegate : public GenericURLRequestJob::Delegate {
+class HEADLESS_EXPORT MockGenericURLRequestJobDelegate
+    : public GenericURLRequestJob::Delegate {
  public:
   MockGenericURLRequestJobDelegate();
   ~MockGenericURLRequestJobDelegate() override;
@@ -50,7 +52,7 @@
 };
 
 // TODO(alexclarke): We may be able to replace this with the CookieMonster.
-class MockCookieStore : public net::CookieStore {
+class HEADLESS_EXPORT MockCookieStore : public net::CookieStore {
  public:
   MockCookieStore();
   ~MockCookieStore() override;
@@ -128,7 +130,8 @@
   DISALLOW_COPY_AND_ASSIGN(MockCookieStore);
 };
 
-class MockURLRequestDelegate : public net::URLRequest::Delegate {
+class HEADLESS_EXPORT MockURLRequestDelegate
+    : public net::URLRequest::Delegate {
  public:
   MockURLRequestDelegate();
   ~MockURLRequestDelegate() override;
diff --git a/headless/public/util/url_fetcher.h b/headless/public/util/url_fetcher.h
index 3ea1658..41bf3fa 100644
--- a/headless/public/util/url_fetcher.h
+++ b/headless/public/util/url_fetcher.h
@@ -11,6 +11,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "headless/public/headless_export.h"
 #include "net/base/net_errors.h"
 #include "url/gurl.h"
 
@@ -22,13 +23,13 @@
 namespace headless {
 
 // An interface for fetching URLs. Note these are only intended to be used once.
-class URLFetcher {
+class HEADLESS_EXPORT URLFetcher {
  public:
   URLFetcher() {}
   virtual ~URLFetcher() {}
 
   // Interface for reporting the fetch result.
-  class ResultListener {
+  class HEADLESS_EXPORT ResultListener {
    public:
     ResultListener() {}
 
diff --git a/headless/public/util/url_request_dispatcher.h b/headless/public/util/url_request_dispatcher.h
index 3029dd5..8525bff5 100644
--- a/headless/public/util/url_request_dispatcher.h
+++ b/headless/public/util/url_request_dispatcher.h
@@ -6,6 +6,7 @@
 #define HEADLESS_PUBLIC_UTIL_URL_REQUEST_DISPATCHER_H_
 
 #include "base/macros.h"
+#include "headless/public/headless_export.h"
 #include "net/base/net_errors.h"
 
 namespace headless {
@@ -15,7 +16,7 @@
 // Interface to abstract and potentially reorder (for determinism) calls to
 // ManagedDispatchUrlRequestJob::OnHeadersComplete and
 // ManagedDispatchUrlRequestJob::NotifyStartError.
-class URLRequestDispatcher {
+class HEADLESS_EXPORT URLRequestDispatcher {
  public:
   URLRequestDispatcher() {}
   virtual ~URLRequestDispatcher() {}
diff --git a/ios/chrome/browser/web/navigation_manager_util_unittest.mm b/ios/chrome/browser/web/navigation_manager_util_unittest.mm
index b02466b..da53996 100644
--- a/ios/chrome/browser/web/navigation_manager_util_unittest.mm
+++ b/ios/chrome/browser/web/navigation_manager_util_unittest.mm
@@ -57,15 +57,14 @@
 // Tests that when all items are redirects, the first one is returned.
 TEST_F(NavigationManagerUtilTest, TestLastNonRedirectedItemAllRedirects) {
   nav_manager_.AddItem(GURL("http://bar.com/redir0"),
-                       ui::PAGE_TRANSITION_SERVER_REDIRECT);
+                       ui::PAGE_TRANSITION_CLIENT_REDIRECT);
   nav_manager_.AddItem(GURL("http://bar.com/redir1"),
                        ui::PAGE_TRANSITION_CLIENT_REDIRECT);
   nav_manager_.AddItem(GURL("http://bar.com/redir2"),
                        ui::PAGE_TRANSITION_CLIENT_REDIRECT);
   web::NavigationItem* item = GetLastNonRedirectedItem(&nav_manager_);
   ASSERT_TRUE(item);
-  EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs(
-      item->GetTransitionType(), ui::PAGE_TRANSITION_SERVER_REDIRECT));
+  EXPECT_EQ(GURL("http://bar.com/redir0"), item->GetURL());
 }
 
 // Tests that earlier redirects are not found.
diff --git a/ios/chrome/test/earl_grey/chrome_actions.h b/ios/chrome/test/earl_grey/chrome_actions.h
index 4000ccd..53448a5f 100644
--- a/ios/chrome/test/earl_grey/chrome_actions.h
+++ b/ios/chrome/test/earl_grey/chrome_actions.h
@@ -20,11 +20,6 @@
 id<GREYAction> LongPressElementForContextMenu(const std::string& element_id,
                                               bool triggers_context_menu);
 
-// TODO(crbug.com/683432): Delete this once downstream code uses the correct
-// format.
-id<GREYAction> longPressElementForContextMenu(const std::string& element_id,
-                                              bool triggers_context_menu);
-
 // Action to turn the switch of a CollectionViewSwitchCell to the given |on|
 // state.
 id<GREYAction> TurnCollectionViewSwitchOn(BOOL on);
diff --git a/ios/chrome/test/earl_grey/chrome_actions.mm b/ios/chrome/test/earl_grey/chrome_actions.mm
index 6c4eb6c1..229479a 100644
--- a/ios/chrome/test/earl_grey/chrome_actions.mm
+++ b/ios/chrome/test/earl_grey/chrome_actions.mm
@@ -22,11 +22,6 @@
       triggers_context_menu);
 }
 
-id<GREYAction> longPressElementForContextMenu(const std::string& element_id,
-                                              bool triggers_context_menu) {
-  return LongPressElementForContextMenu(element_id, triggers_context_menu);
-}
-
 id<GREYAction> TurnCollectionViewSwitchOn(BOOL on) {
   id<GREYMatcher> constraints = grey_not(grey_systemAlertViewShown());
   NSString* actionName =
diff --git a/ios/third_party/material_roboto_font_loader_ios/README.chromium b/ios/third_party/material_roboto_font_loader_ios/README.chromium
index 1aeab73..5cec40ca 100644
--- a/ios/third_party/material_roboto_font_loader_ios/README.chromium
+++ b/ios/third_party/material_roboto_font_loader_ios/README.chromium
@@ -1,7 +1,7 @@
 Name: Material Roboto Font Loader iOS
 URL: https://github.com/material-foundation/material-roboto-font-loader-ios
 Version: 0
-Revision: c9e9be95578fdf853c1e197d0e19dce1ceffc918
+Revision: 4aa51e906e5671c71d24e991f1f10d782a58409f
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/ios/web/navigation/crw_session_controller.mm b/ios/web/navigation/crw_session_controller.mm
index ec96f47..2fcda1a 100644
--- a/ios/web/navigation/crw_session_controller.mm
+++ b/ios/web/navigation/crw_session_controller.mm
@@ -285,6 +285,10 @@
               referrer:(const web::Referrer&)ref
             transition:(ui::PageTransition)trans
         initiationType:(web::NavigationInitiationType)initiationType {
+  // Server side redirects are handled by updating existing pending item instead
+  // of adding a new item.
+  DCHECK((trans & ui::PAGE_TRANSITION_SERVER_REDIRECT) == 0);
+
   [self discardTransientItem];
   self.pendingItemIndex = -1;
 
diff --git a/ios/web/navigation/crw_session_controller_unittest.mm b/ios/web/navigation/crw_session_controller_unittest.mm
index df8b252f6..2079ced 100644
--- a/ios/web/navigation/crw_session_controller_unittest.mm
+++ b/ios/web/navigation/crw_session_controller_unittest.mm
@@ -927,7 +927,7 @@
   [session_controller_
       addPendingItem:GURL("http://www.example.com/redirect")
             referrer:MakeReferrer("http://www.example.com/r")
-          transition:ui::PAGE_TRANSITION_IS_REDIRECT_MASK
+          transition:ui::PAGE_TRANSITION_CLIENT_REDIRECT
       initiationType:web::NavigationInitiationType::USER_INITIATED];
   [session_controller_ commitPendingItem];
   [session_controller_
@@ -971,7 +971,7 @@
   [session_controller_
       addPendingItem:GURL("http://www.example.com/redirect")
             referrer:MakeReferrer("http://www.example.com/r")
-          transition:ui::PAGE_TRANSITION_IS_REDIRECT_MASK
+          transition:ui::PAGE_TRANSITION_CLIENT_REDIRECT
       initiationType:web::NavigationInitiationType::USER_INITIATED];
   [session_controller_ commitPendingItem];
   [session_controller_
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm
index 9bc5a3a..7bac755 100644
--- a/ios/web/navigation/navigation_manager_impl_unittest.mm
+++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -254,7 +254,7 @@
   [session_controller() commitPendingItem];
   navigation_manager()->AddPendingItem(
       GURL("http://www.url.com/redirect"), Referrer(),
-      ui::PAGE_TRANSITION_IS_REDIRECT_MASK,
+      ui::PAGE_TRANSITION_CLIENT_REDIRECT,
       web::NavigationInitiationType::USER_INITIATED);
   [session_controller() commitPendingItem];
   navigation_manager()->AddPendingItem(
@@ -267,7 +267,7 @@
   [session_controller() commitPendingItem];
   navigation_manager()->AddPendingItem(
       GURL("http://www.url.com/redirect"), Referrer(),
-      ui::PAGE_TRANSITION_IS_REDIRECT_MASK,
+      ui::PAGE_TRANSITION_CLIENT_REDIRECT,
       web::NavigationInitiationType::USER_INITIATED);
   [session_controller() commitPendingItem];
   ASSERT_EQ(5, navigation_manager()->GetItemCount());
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 2d14db8..c8b1ccd 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -1467,7 +1467,8 @@
   // Transfer time is registered so that further transitions within the time
   // envelope are not also registered as links.
   _lastTransferTimeInSeconds = CFAbsoluteTimeGetCurrent();
-  if (!(transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK)) {
+  bool redirect = transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK;
+  if (!redirect) {
     // Before changing phases, the delegate should be informed that any existing
     // request is being cancelled before completion.
     [self loadCancelled];
@@ -1477,7 +1478,7 @@
   _loadPhase = web::LOAD_REQUESTED;
   _lastRegisteredRequestURL = requestURL;
 
-  if (!(transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK)) {
+  if (!redirect) {
     // Record state of outgoing page.
     [self recordStateInHistory];
   }
diff --git a/ipc/OWNERS b/ipc/OWNERS
index 5ac52a2..b8baa34 100644
--- a/ipc/OWNERS
+++ b/ipc/OWNERS
@@ -13,4 +13,6 @@
 per-file *_param_traits*.*=set noparent
 per-file *_param_traits*.*=file://ipc/SECURITY_OWNERS
 
+per-file SECURITY_OWNERS=file://ipc/SECURITY_OWNERS
+
 # COMPONENT: Internals>Core
diff --git a/ipc/SECURITY_OWNERS b/ipc/SECURITY_OWNERS
index 4a6c965d..8a9c3810 100644
--- a/ipc/SECURITY_OWNERS
+++ b/ipc/SECURITY_OWNERS
@@ -2,7 +2,6 @@
 # new sandbox escapes.
 dcheng@chromium.org
 estark@chromium.org
-jln@chromium.org
 kenrb@chromium.org
 meacer@chromium.org
 mbarbella@chromium.org
@@ -10,7 +9,6 @@
 nasko@chromium.org
 ochang@chromium.org
 palmer@chromium.org
-rickyz@chromium.org
 rsesek@chromium.org
 tsepez@chromium.org
 wfh@chromium.org
diff --git a/ipc/ipc_channel_mojo.cc b/ipc/ipc_channel_mojo.cc
index d0129e3..ab376f4b 100644
--- a/ipc/ipc_channel_mojo.cc
+++ b/ipc/ipc_channel_mojo.cc
@@ -479,8 +479,14 @@
 void ChannelMojo::GetGenericRemoteAssociatedInterface(
     const std::string& name,
     mojo::ScopedInterfaceEndpointHandle handle) {
-  if (message_reader_)
+  if (message_reader_) {
     message_reader_->GetRemoteInterface(name, std::move(handle));
+  } else {
+    // Attach the associated interface to a disconnected pipe, so that the
+    // associated interface pointer can be used to make calls (which are
+    // dropped).
+    mojo::GetIsolatedInterface(std::move(handle));
+  }
 }
 
 }  // namespace IPC
diff --git a/ipc/ipc_sync_message_filter.cc b/ipc/ipc_sync_message_filter.cc
index b75876a..15ffdbc 100644
--- a/ipc/ipc_sync_message_filter.cc
+++ b/ipc/ipc_sync_message_filter.cc
@@ -180,8 +180,13 @@
     mojo::ScopedInterfaceEndpointHandle handle) {
   base::AutoLock auto_lock(lock_);
   DCHECK(io_task_runner_ && io_task_runner_->BelongsToCurrentThread());
-  if (!channel_)
+  if (!channel_) {
+    // Attach the associated interface to a disconnected pipe, so that the
+    // associated interface pointer can be used to make calls (which are
+    // dropped).
+    mojo::GetIsolatedInterface(std::move(handle));
     return;
+  }
 
   Channel::AssociatedInterfaceSupport* support =
       channel_->GetAssociatedInterfaceSupport();
diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn
index 4561c39..bd87965f 100644
--- a/mojo/public/cpp/bindings/BUILD.gn
+++ b/mojo/public/cpp/bindings/BUILD.gn
@@ -54,6 +54,7 @@
     "lib/associated_binding.cc",
     "lib/associated_group.cc",
     "lib/associated_group_controller.cc",
+    "lib/associated_interface_ptr.cc",
     "lib/associated_interface_ptr_state.h",
     "lib/binding_state.cc",
     "lib/binding_state.h",
diff --git a/mojo/public/cpp/bindings/associated_interface_ptr.h b/mojo/public/cpp/bindings/associated_interface_ptr.h
index 1d2ec0c1..8806a3e09 100644
--- a/mojo/public/cpp/bindings/associated_interface_ptr.h
+++ b/mojo/public/cpp/bindings/associated_interface_ptr.h
@@ -18,6 +18,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
 #include "mojo/public/cpp/bindings/associated_interface_request.h"
+#include "mojo/public/cpp/bindings/bindings_export.h"
 #include "mojo/public/cpp/bindings/connection_error_callback.h"
 #include "mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h"
 #include "mojo/public/cpp/bindings/lib/multiplex_router.h"
@@ -270,6 +271,13 @@
   return request;
 }
 
+// |handle| is supposed to be the request of an associated interface. This
+// method associates the interface with a dedicated, disconnected message pipe.
+// That way, the corresponding associated interface pointer of |handle| can
+// safely make calls (although those calls are silently dropped).
+MOJO_CPP_BINDINGS_EXPORT void GetIsolatedInterface(
+    ScopedInterfaceEndpointHandle handle);
+
 }  // namespace mojo
 
 #endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_H_
diff --git a/mojo/public/cpp/bindings/lib/associated_interface_ptr.cc b/mojo/public/cpp/bindings/lib/associated_interface_ptr.cc
new file mode 100644
index 0000000..78281ed
--- /dev/null
+++ b/mojo/public/cpp/bindings/lib/associated_interface_ptr.cc
@@ -0,0 +1,18 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
+
+namespace mojo {
+
+void GetIsolatedInterface(ScopedInterfaceEndpointHandle handle) {
+  MessagePipe pipe;
+  scoped_refptr<internal::MultiplexRouter> router =
+      new internal::MultiplexRouter(std::move(pipe.handle0),
+                                    internal::MultiplexRouter::MULTI_INTERFACE,
+                                    false, base::ThreadTaskRunnerHandle::Get());
+  router->AssociateInterface(std::move(handle));
+}
+
+}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
index 625c49c..be225e47 100644
--- a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
@@ -1178,6 +1178,12 @@
   run_loop.Run();
 }
 
+TEST_F(AssociatedInterfaceTest, GetIsolatedInterface) {
+  IntegerSenderAssociatedPtr sender;
+  GetIsolatedInterface(MakeRequest(&sender).PassHandle());
+  sender->Send(42);
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace mojo
diff --git a/mojo/public/interfaces/bindings/BUILD.gn b/mojo/public/interfaces/bindings/BUILD.gn
index eab75c1..c2cadcd7 100644
--- a/mojo/public/interfaces/bindings/BUILD.gn
+++ b/mojo/public/interfaces/bindings/BUILD.gn
@@ -15,3 +15,15 @@
   export_define = "MOJO_CPP_BINDINGS_IMPLEMENTATION"
   export_header = "mojo/public/cpp/bindings/bindings_export.h"
 }
+
+# TODO(yzshen): Remove this target and use the one above once
+# |use_new_js_bindings| becomes true by default.
+mojom("new_bindings") {
+  visibility = []
+  sources = [
+    "new_bindings/interface_control_messages.mojom",
+    "new_bindings/pipe_control_messages.mojom",
+  ]
+
+  use_new_js_bindings = true
+}
diff --git a/services/image_decoder/public/interfaces/OWNERS b/mojo/public/interfaces/bindings/new_bindings/OWNERS
similarity index 100%
copy from services/image_decoder/public/interfaces/OWNERS
copy to mojo/public/interfaces/bindings/new_bindings/OWNERS
diff --git a/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom b/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom
new file mode 100644
index 0000000..e03ffd6
--- /dev/null
+++ b/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom
@@ -0,0 +1,67 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+[JavaPackage="org.chromium.mojo.bindings.interfacecontrol"]
+module mojo.interface_control2;
+
+// For each user-defined interface, some control functions are provided by the
+// interface endpoints at both sides.
+
+////////////////////////////////////////////////////////////////////////////////
+// Run@0xFFFFFFFF(RunInput input) => (RunOutput? output);
+//
+// This control function runs the input command. If the command is not
+// supported, |output| is set to null; otherwise |output| stores the result,
+// whose type depends on the input.
+
+const uint32 kRunMessageId = 0xFFFFFFFF;
+
+struct RunMessageParams {
+  RunInput input;
+};
+union RunInput {
+  QueryVersion query_version;
+  FlushForTesting flush_for_testing;
+};
+
+struct RunResponseMessageParams {
+  RunOutput? output;
+};
+union RunOutput {
+  QueryVersionResult query_version_result;
+};
+
+// Queries the max supported version of the user-defined interface.
+// Sent by the interface client side.
+struct QueryVersion {
+};
+struct QueryVersionResult {
+  uint32 version;
+};
+
+// Sent by either side of the interface.
+struct FlushForTesting {
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
+//
+// This control function runs the input command. If the operation fails or the
+// command is not supported, the message pipe is closed.
+
+const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
+
+struct RunOrClosePipeMessageParams {
+  RunOrClosePipeInput input;
+};
+union RunOrClosePipeInput {
+  RequireVersion require_version;
+};
+
+// If the specified version of the user-defined interface is not supported, the
+// function fails and the pipe is closed.
+// Sent by the interface client side.
+struct RequireVersion {
+  uint32 version;
+};
diff --git a/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom b/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom
new file mode 100644
index 0000000..69975fc1
--- /dev/null
+++ b/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom
@@ -0,0 +1,46 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+[JavaPackage="org.chromium.mojo.bindings.pipecontrol"]
+module mojo.pipe_control2;
+
+// For each message pipe running user-defined interfaces, some control
+// functions are provided and used by the routers at both ends of the pipe, so
+// that they can coordinate to manage interface endpoints.
+// All these control messages will have the interface ID field in the message
+// header set to invalid.
+
+////////////////////////////////////////////////////////////////////////////////
+// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
+//
+// This control function runs the input command. If the operation fails or the
+// command is not supported, the message pipe is closed.
+
+const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
+
+struct RunOrClosePipeMessageParams {
+  RunOrClosePipeInput input;
+};
+
+union RunOrClosePipeInput {
+  PeerAssociatedEndpointClosedEvent peer_associated_endpoint_closed_event;
+};
+
+// A user-defined reason about why the interface is disconnected.
+struct DisconnectReason {
+  uint32 custom_reason;
+  string description;
+};
+
+// An event to notify that an interface endpoint set up at the message sender
+// side has been closed.
+//
+// This event is omitted if the endpoint belongs to the master interface and
+// there is no disconnect reason specified.
+struct PeerAssociatedEndpointClosedEvent {
+  // The interface ID.
+  uint32 id;
+  DisconnectReason? disconnect_reason;
+};
+
diff --git a/mojo/public/interfaces/bindings/tests/BUILD.gn b/mojo/public/interfaces/bindings/tests/BUILD.gn
index 0e086c3..e496eb65 100644
--- a/mojo/public/interfaces/bindings/tests/BUILD.gn
+++ b/mojo/public/interfaces/bindings/tests/BUILD.gn
@@ -27,6 +27,7 @@
     "validation_test_interfaces.mojom",
   ]
   public_deps = [
+    ":echo",
     ":test_mojom_import",
     ":test_mojom_import2",
   ]
@@ -192,3 +193,12 @@
     ":test_interfaces",
   ]
 }
+
+mojom("echo") {
+  testonly = true
+  sources = [
+    "echo.mojom",
+    "echo_import.mojom",
+  ]
+  use_new_js_bindings = true
+}
diff --git a/mojo/public/interfaces/bindings/tests/echo.mojom b/mojo/public/interfaces/bindings/tests/echo.mojom
new file mode 100644
index 0000000..56c60630
--- /dev/null
+++ b/mojo/public/interfaces/bindings/tests/echo.mojom
@@ -0,0 +1,12 @@
+// 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.
+
+module test.echo.mojom;
+
+import "echo_import.mojom";
+
+interface Echo {
+  EchoPoint(test.echo_import.mojom.Point point)
+      => (test.echo_import.mojom.Point result);
+};
diff --git a/mojo/public/interfaces/bindings/tests/echo_import.mojom b/mojo/public/interfaces/bindings/tests/echo_import.mojom
new file mode 100644
index 0000000..a024ce2f
--- /dev/null
+++ b/mojo/public/interfaces/bindings/tests/echo_import.mojom
@@ -0,0 +1,10 @@
+// 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.
+
+module test.echo_import.mojom;
+
+struct Point {
+  int32 x;
+  int32 y;
+};
diff --git a/mojo/public/js/BUILD.gn b/mojo/public/js/BUILD.gn
index 6c8fbee..5c8f12e0 100644
--- a/mojo/public/js/BUILD.gn
+++ b/mojo/public/js/BUILD.gn
@@ -30,10 +30,48 @@
   ]
 
   deps = [
+    ":new_bindings",
     "//mojo/public/interfaces/bindings:bindings__generator",
   ]
 }
 
+action("new_bindings") {
+  new_bindings_js_files = [
+    # This must be the first file in the list, because it initializes global
+    # variable |mojoBindings| that the others need to refer to.
+    "new_bindings/base.js",
+
+    "$interfaces_bindings_gen_dir/new_bindings/interface_control_messages.mojom.js",
+    "new_bindings/bindings.js",
+    "new_bindings/buffer.js",
+    "new_bindings/codec.js",
+    "new_bindings/connector.js",
+    "new_bindings/interface_types.js",
+    "new_bindings/lib/control_message_handler.js",
+    "new_bindings/lib/control_message_proxy.js",
+    "new_bindings/router.js",
+    "new_bindings/unicode.js",
+    "new_bindings/validator.js",
+  ]
+  compiled_file = "$target_gen_dir/mojo_bindings.js"
+
+  # TODO(yzshen): Eventually we would like to use Closure Compiler to minify the
+  # bindings instead of simply concatenating the files.
+  script = "//v8/tools/concatenate-files.py"
+
+  sources = new_bindings_js_files
+  outputs = [
+    compiled_file,
+  ]
+
+  args = rebase_path(new_bindings_js_files)
+  args += [ rebase_path(compiled_file) ]
+
+  deps = [
+    "//mojo/public/interfaces/bindings:new_bindings__generator",
+  ]
+}
+
 group("tests") {
   testonly = true
 
diff --git a/mojo/public/js/new_bindings/base.js b/mojo/public/js/new_bindings/base.js
new file mode 100644
index 0000000..4c86fb1
--- /dev/null
+++ b/mojo/public/js/new_bindings/base.js
@@ -0,0 +1,111 @@
+// 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.
+
+'use strict';
+
+if (mojoBindings) {
+  throw new Error('mojoBindings has been initialized.');
+}
+
+var mojoBindings = {};
+mojoBindings.internal = {};
+mojoBindings.internal.global = this;
+mojoBindings.config = {
+  // Whether to automatically load mojom dependencies.
+  // For example, if foo.mojom imports bar.mojom, |autoLoadMojomDeps| set to
+  // true means that loading foo.mojom.js will insert a <script> tag to load
+  // bar.mojom.js, if it hasn't been loaded.
+  //
+  // The URL of bar.mojom.js is determined by the relative path of bar.mojom
+  // (relative to the position of foo.mojom at build time) and the URL of
+  // foo.mojom.js. For exmple, if at build time the two mojom files are
+  // located at:
+  //   a/b/c/foo.mojom
+  //   a/b/d/bar.mojom
+  // and the URL of foo.mojom.js is:
+  //   http://example.org/scripts/b/c/foo.mojom.js
+  // then the URL of bar.mojom.js will be:
+  //   http://example.org/scripts/b/d/bar.mojom.js
+  //
+  // If you would like bar.mojom.js to live at a different location, you need
+  // to turn off |autoLoadMojomDeps| before loading foo.mojom.js, and manually
+  // load bar.mojom.js yourself. Similarly, you need to turn off the option if
+  // you merge bar.mojom.js and foo.mojom.js into a single file.
+  //
+  // Performance tip: Avoid loading the same mojom.js file multiple times.
+  // Assume that |autoLoadMojomDeps| is set to true:
+  // <!-- No duplicate loading; recommended. -->
+  // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
+  //
+  // <!-- No duplicate loading, although unnecessary. -->
+  // <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
+  // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
+  //
+  // <!-- Load bar.mojom.js twice; should be avoided. -->
+  // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
+  // <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
+  autoLoadMojomDeps: true
+};
+
+(function() {
+  var internal = mojoBindings.internal;
+
+  var LoadState = {
+    PENDING_LOAD: 1,
+    LOADED: 2
+  };
+
+  var mojomRegistry = new Map();
+
+  function exposeNamespace(namespace) {
+    var current = internal.global;
+    var parts = namespace.split('.');
+
+    for (var part; parts.length && (part = parts.shift());) {
+      if (!current[part]) {
+        current[part] = {};
+      }
+      current = current[part];
+    }
+
+    return current;
+  }
+
+  function isMojomPendingLoad(id) {
+    return mojomRegistry.get(id) === LoadState.PENDING_LOAD;
+  }
+
+  function isMojomLoaded(id) {
+    return mojomRegistry.get(id) === LoadState.LOADED;
+  }
+
+  function markMojomPendingLoad(id) {
+    if (isMojomLoaded(id)) {
+      throw new Error('The following mojom file has been loaded: ' + id);
+    }
+
+    mojomRegistry.set(id, LoadState.PENDING_LOAD);
+  }
+
+  function markMojomLoaded(id) {
+    mojomRegistry.set(id, LoadState.LOADED);
+  }
+
+  function loadMojomIfNecessary(id, url) {
+    if (mojomRegistry.has(id)) {
+      return;
+    }
+
+    markMojomPendingLoad(id);
+    internal.global.document.write('<script type="text/javascript" src="' +
+                                   url + '"></script>');
+  }
+
+  internal.exposeNamespace = exposeNamespace;
+  internal.isMojomPendingLoad = isMojomPendingLoad;
+  internal.isMojomLoaded = isMojomLoaded;
+  internal.markMojomPendingLoad = markMojomPendingLoad;
+  internal.markMojomLoaded = markMojomLoaded;
+  internal.loadMojomIfNecessary = loadMojomIfNecessary;
+})();
diff --git a/mojo/public/js/new_bindings/bindings.js b/mojo/public/js/new_bindings/bindings.js
index f3e40d29..8dcb946e 100644
--- a/mojo/public/js/new_bindings/bindings.js
+++ b/mojo/public/js/new_bindings/bindings.js
@@ -2,19 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-define("mojo/public/js/bindings", [
-  "mojo/public/js/core",
-  "mojo/public/js/lib/control_message_proxy",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/router",
-], function(core, controlMessageProxy, types, router) {
-
+(function() {
+  var internal = mojoBindings.internal;
   // ---------------------------------------------------------------------------
 
   function makeRequest(interfacePtr) {
-    var pipe = core.createMessagePipe();
-    interfacePtr.ptr.bind(new types.InterfacePtrInfo(pipe.handle0, 0));
-    return new types.InterfaceRequest(pipe.handle1);
+    var pipe = Mojo.createMessagePipe();
+    interfacePtr.ptr.bind(new mojoBindings.InterfacePtrInfo(pipe.handle0, 0));
+    return new mojoBindings.InterfaceRequest(pipe.handle1);
   }
 
   // ---------------------------------------------------------------------------
@@ -41,7 +36,7 @@
   InterfacePtrController.prototype.bind = function(ptrInfoOrHandle) {
     this.reset();
 
-    if (ptrInfoOrHandle instanceof types.InterfacePtrInfo) {
+    if (ptrInfoOrHandle instanceof mojoBindings.InterfacePtrInfo) {
       this.version = ptrInfoOrHandle.version;
       this.handle_ = ptrInfoOrHandle.handle;
     } else {
@@ -64,7 +59,7 @@
       this.proxy_ = null;
     }
     if (this.handle_) {
-      core.close(this.handle_);
+      this.handle_.close();
       this.handle_ = null;
     }
   };
@@ -82,12 +77,12 @@
     var result;
     if (this.router_) {
       // TODO(yzshen): Fix Router interface to support extracting handle.
-      result = new types.InterfacePtrInfo(
+      result = new mojoBindings.InterfacePtrInfo(
           this.router_.connector_.handle_, this.version);
       this.router_.connector_.handle_ = null;
     } else {
       // This also handles the case when this object is not bound.
-      result = new types.InterfacePtrInfo(this.handle_, this.version);
+      result = new mojoBindings.InterfacePtrInfo(this.handle_, this.version);
       this.handle_ = null;
     }
 
@@ -109,12 +104,11 @@
     if (!this.handle_)
       return;
 
-    this.router_ = new router.Router(this.handle_);
+    this.router_ = new internal.Router(this.handle_);
     this.handle_ = null;
     this.router_ .setPayloadValidators([this.interfaceType_.validateResponse]);
 
-    this.controlMessageProxy_ = new
-        controlMessageProxy.ControlMessageProxy(this.router_);
+    this.controlMessageProxy_ = new internal.ControlMessageProxy(this.router_);
 
     this.proxy_ = new this.interfaceType_.proxyClass(this.router_);
   };
@@ -179,13 +173,13 @@
   Binding.prototype.bind = function(requestOrHandle) {
     this.close();
 
-    var handle = requestOrHandle instanceof types.InterfaceRequest ?
+    var handle = requestOrHandle instanceof mojoBindings.InterfaceRequest ?
         requestOrHandle.handle : requestOrHandle;
-    if (!core.isHandle(handle))
+    if (!(handle instanceof MojoHandle))
       return;
 
     this.stub_ = new this.interfaceType_.stubClass(this.impl_);
-    this.router_ = new router.Router(handle, this.interfaceType_.kVersion);
+    this.router_ = new internal.Router(handle, this.interfaceType_.kVersion);
     this.router_.setIncomingReceiver(this.stub_);
     this.router_ .setPayloadValidators([this.interfaceType_.validateRequest]);
   };
@@ -208,9 +202,10 @@
 
   Binding.prototype.unbind = function() {
     if (!this.isBound())
-      return new types.InterfaceRequest(null);
+      return new mojoBindings.InterfaceRequest(null);
 
-    var result = new types.InterfaceRequest(this.router_.connector_.handle_);
+    var result = new mojoBindings.InterfaceRequest(
+        this.router_.connector_.handle_);
     this.router_.connector_.handle_ = null;
     this.close();
     return result;
@@ -273,13 +268,9 @@
       this.errorHandler_();
   };
 
-  var exports = {};
-  exports.InterfacePtrInfo = types.InterfacePtrInfo;
-  exports.InterfaceRequest = types.InterfaceRequest;
-  exports.makeRequest = makeRequest;
-  exports.InterfacePtrController = InterfacePtrController;
-  exports.Binding = Binding;
-  exports.BindingSet = BindingSet;
 
-  return exports;
-});
+  mojoBindings.makeRequest = makeRequest;
+  mojoBindings.Binding = Binding;
+  mojoBindings.BindingSet = BindingSet;
+  mojoBindings.InterfacePtrController = InterfacePtrController;
+})();
diff --git a/mojo/public/js/new_bindings/buffer.js b/mojo/public/js/new_bindings/buffer.js
index e35f6951..7c0853c 100644
--- a/mojo/public/js/new_bindings/buffer.js
+++ b/mojo/public/js/new_bindings/buffer.js
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-define("mojo/public/js/buffer", function() {
+(function() {
+  var internal = mojoBindings.internal;
 
   var kHostIsLittleEndian = (function () {
     var endianArrayBuffer = new ArrayBuffer(2);
@@ -150,7 +151,5 @@
     this.dataView.setFloat64(offset, value, kHostIsLittleEndian);
   }
 
-  var exports = {};
-  exports.Buffer = Buffer;
-  return exports;
-});
+  internal.Buffer = Buffer;
+})();
diff --git a/mojo/public/js/new_bindings/codec.js b/mojo/public/js/new_bindings/codec.js
index ff5d31a..5976e95 100644
--- a/mojo/public/js/new_bindings/codec.js
+++ b/mojo/public/js/new_bindings/codec.js
@@ -2,11 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-define("mojo/public/js/codec", [
-  "mojo/public/js/buffer",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/unicode",
-], function(buffer, types, unicode) {
+(function() {
+  var internal = mojoBindings.internal;
 
   var kErrorUnsigned = "Passing negative value to unsigned";
   var kErrorArray = "Passing non Array for array type";
@@ -138,7 +135,7 @@
     var numberOfElements = this.readUint32();
     var base = this.next;
     this.next += numberOfElements;
-    return unicode.decodeUtf8String(
+    return internal.decodeUtf8String(
         new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements));
   };
 
@@ -314,7 +311,7 @@
 
   Encoder.prototype.encodeString = function(val) {
     var base = this.next + kArrayHeaderSize;
-    var numberOfElements = unicode.encodeUtf8String(
+    var numberOfElements = internal.encodeUtf8String(
         val, new Uint8Array(this.buffer.arrayBuffer, base));
     var numberOfBytes = kArrayHeaderSize + numberOfElements;
     this.writeUint32(numberOfBytes);
@@ -389,7 +386,7 @@
     if (typeof(val) !== "string") {
       throw new Error(kErrorString);
     }
-    var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
+    var encodedSize = kArrayHeaderSize + internal.utf8Length(val);
     var encoder = this.createAndEncodeEncoder(encodedSize);
     encoder.encodeString(val);
   };
@@ -473,7 +470,7 @@
     // Currently, we don't compute the payload size correctly ahead of time.
     // Instead, we resize the buffer at the end.
     var numberOfBytes = kMessageHeaderSize + payloadSize;
-    this.buffer = new buffer.Buffer(numberOfBytes);
+    this.buffer = new internal.Buffer(numberOfBytes);
     this.handles = [];
     var encoder = this.createEncoder(kMessageHeaderSize);
     encoder.writeUint32(kMessageHeaderSize);
@@ -511,7 +508,7 @@
     // Currently, we don't compute the payload size correctly ahead of time.
     // Instead, we resize the buffer at the end.
     var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize;
-    this.buffer = new buffer.Buffer(numberOfBytes);
+    this.buffer = new internal.Buffer(numberOfBytes);
     this.handles = [];
     var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize);
     encoder.writeUint32(kMessageWithRequestIDHeaderSize);
@@ -814,7 +811,7 @@
   Interface.prototype.encodedSize = 8;
 
   Interface.prototype.decode = function(decoder) {
-    var interfacePtrInfo = new types.InterfacePtrInfo(
+    var interfacePtrInfo = new mojoBindings.InterfacePtrInfo(
         decoder.decodeHandle(), decoder.readUint32());
     var interfacePtr = new this.cls();
     interfacePtr.ptr.bind(interfacePtrInfo);
@@ -823,7 +820,8 @@
 
   Interface.prototype.encode = function(encoder, val) {
     var interfacePtrInfo =
-        val ? val.ptr.passInterface() : new types.InterfacePtrInfo(null, 0);
+        val ? val.ptr.passInterface() :
+              new mojoBindings.InterfacePtrInfo(null, 0);
     encoder.encodeHandle(interfacePtrInfo.handle);
     encoder.writeUint32(interfacePtrInfo.version);
   };
@@ -840,7 +838,7 @@
   InterfaceRequest.encodedSize = 4;
 
   InterfaceRequest.decode = function(decoder) {
-    return new types.InterfaceRequest(decoder.decodeHandle());
+    return new mojoBindings.InterfaceRequest(decoder.decodeHandle());
   };
 
   InterfaceRequest.encode = function(encoder, val) {
@@ -877,46 +875,44 @@
 
   NullableMapOf.prototype = Object.create(MapOf.prototype);
 
-  var exports = {};
-  exports.align = align;
-  exports.isAligned = isAligned;
-  exports.Message = Message;
-  exports.MessageBuilder = MessageBuilder;
-  exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
-  exports.MessageReader = MessageReader;
-  exports.kArrayHeaderSize = kArrayHeaderSize;
-  exports.kMapStructPayloadSize = kMapStructPayloadSize;
-  exports.kStructHeaderSize = kStructHeaderSize;
-  exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
-  exports.kMessageHeaderSize = kMessageHeaderSize;
-  exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
-  exports.kMessageExpectsResponse = kMessageExpectsResponse;
-  exports.kMessageIsResponse = kMessageIsResponse;
-  exports.Int8 = Int8;
-  exports.Uint8 = Uint8;
-  exports.Int16 = Int16;
-  exports.Uint16 = Uint16;
-  exports.Int32 = Int32;
-  exports.Uint32 = Uint32;
-  exports.Int64 = Int64;
-  exports.Uint64 = Uint64;
-  exports.Float = Float;
-  exports.Double = Double;
-  exports.String = String;
-  exports.Enum = Enum;
-  exports.NullableString = NullableString;
-  exports.PointerTo = PointerTo;
-  exports.NullablePointerTo = NullablePointerTo;
-  exports.ArrayOf = ArrayOf;
-  exports.NullableArrayOf = NullableArrayOf;
-  exports.PackedBool = PackedBool;
-  exports.Handle = Handle;
-  exports.NullableHandle = NullableHandle;
-  exports.Interface = Interface;
-  exports.NullableInterface = NullableInterface;
-  exports.InterfaceRequest = InterfaceRequest;
-  exports.NullableInterfaceRequest = NullableInterfaceRequest;
-  exports.MapOf = MapOf;
-  exports.NullableMapOf = NullableMapOf;
-  return exports;
-});
+  internal.align = align;
+  internal.isAligned = isAligned;
+  internal.Message = Message;
+  internal.MessageBuilder = MessageBuilder;
+  internal.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
+  internal.MessageReader = MessageReader;
+  internal.kArrayHeaderSize = kArrayHeaderSize;
+  internal.kMapStructPayloadSize = kMapStructPayloadSize;
+  internal.kStructHeaderSize = kStructHeaderSize;
+  internal.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
+  internal.kMessageHeaderSize = kMessageHeaderSize;
+  internal.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
+  internal.kMessageExpectsResponse = kMessageExpectsResponse;
+  internal.kMessageIsResponse = kMessageIsResponse;
+  internal.Int8 = Int8;
+  internal.Uint8 = Uint8;
+  internal.Int16 = Int16;
+  internal.Uint16 = Uint16;
+  internal.Int32 = Int32;
+  internal.Uint32 = Uint32;
+  internal.Int64 = Int64;
+  internal.Uint64 = Uint64;
+  internal.Float = Float;
+  internal.Double = Double;
+  internal.String = String;
+  internal.Enum = Enum;
+  internal.NullableString = NullableString;
+  internal.PointerTo = PointerTo;
+  internal.NullablePointerTo = NullablePointerTo;
+  internal.ArrayOf = ArrayOf;
+  internal.NullableArrayOf = NullableArrayOf;
+  internal.PackedBool = PackedBool;
+  internal.Handle = Handle;
+  internal.NullableHandle = NullableHandle;
+  internal.Interface = Interface;
+  internal.NullableInterface = NullableInterface;
+  internal.InterfaceRequest = InterfaceRequest;
+  internal.NullableInterfaceRequest = NullableInterfaceRequest;
+  internal.MapOf = MapOf;
+  internal.NullableMapOf = NullableMapOf;
+})();
diff --git a/mojo/public/js/new_bindings/connector.js b/mojo/public/js/new_bindings/connector.js
index 4d062786..3f1bf98 100644
--- a/mojo/public/js/new_bindings/connector.js
+++ b/mojo/public/js/new_bindings/connector.js
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-define("mojo/public/js/connector", [
-  "mojo/public/js/buffer",
-  "mojo/public/js/codec",
-  "mojo/public/js/core",
-  "mojo/public/js/support",
-], function(buffer, codec, core, support) {
+(function() {
+  var internal = mojoBindings.internal;
 
   function Connector(handle) {
-    if (!core.isHandle(handle))
+    if (!(handle instanceof MojoHandle))
       throw new Error("Connector: not a handle " + handle);
     this.handle_ = handle;
     this.dropWrites_ = false;
@@ -20,19 +16,18 @@
     this.errorHandler_ = null;
 
     if (handle) {
-      this.readWatcher_ = support.watch(handle,
-                                        core.HANDLE_SIGNAL_READABLE,
-                                        this.readMore_.bind(this));
+      this.readWatcher_ = handle.watch({readable: true},
+                                       this.readMore_.bind(this));
     }
   }
 
   Connector.prototype.close = function() {
     if (this.readWatcher_) {
-      support.cancelWatch(this.readWatcher_);
+      this.readWatcher_.cancel();
       this.readWatcher_ = null;
     }
     if (this.handle_ != null) {
-      core.close(this.handle_);
+      this.handle_.close();
       this.handle_ = null;
     }
   };
@@ -44,17 +39,15 @@
     if (this.dropWrites_)
       return true;
 
-    var result = core.writeMessage(this.handle_,
-                                   new Uint8Array(message.buffer.arrayBuffer),
-                                   message.handles,
-                                   core.WRITE_MESSAGE_FLAG_NONE);
+    var result = this.handle_.writeMessage(
+        new Uint8Array(message.buffer.arrayBuffer), message.handles);
     switch (result) {
-      case core.RESULT_OK:
+      case Mojo.RESULT_OK:
         // The handles were successfully transferred, so we don't own them
         // anymore.
         message.handles = [];
         break;
-      case core.RESULT_FAILED_PRECONDITION:
+      case Mojo.RESULT_FAILED_PRECONDITION:
         // There's no point in continuing to write to this pipe since the other
         // end is gone. Avoid writing any future messages. Hide write failures
         // from the caller since we'd like them to continue consuming any
@@ -83,32 +76,29 @@
   };
 
   Connector.prototype.waitForNextMessageForTesting = function() {
-    var wait = core.wait(this.handle_, core.HANDLE_SIGNAL_READABLE);
-    this.readMore_(wait.result);
+    // TODO(yzshen): Change the tests that use this method.
+    throw new Error("Not supported!");
   };
 
   Connector.prototype.readMore_ = function(result) {
     for (;;) {
-      var read = core.readMessage(this.handle_,
-                                  core.READ_MESSAGE_FLAG_NONE);
+      var read = this.handle_.readMessage();
       if (this.handle_ == null) // The connector has been closed.
         return;
-      if (read.result == core.RESULT_SHOULD_WAIT)
+      if (read.result == Mojo.RESULT_SHOULD_WAIT)
         return;
-      if (read.result != core.RESULT_OK) {
+      if (read.result != Mojo.RESULT_OK) {
         this.error_ = true;
         if (this.errorHandler_)
           this.errorHandler_.onError(read.result);
         return;
       }
-      var messageBuffer = new buffer.Buffer(read.buffer);
-      var message = new codec.Message(messageBuffer, read.handles);
+      var messageBuffer = new internal.Buffer(read.buffer);
+      var message = new internal.Message(messageBuffer, read.handles);
       if (this.incomingReceiver_)
         this.incomingReceiver_.accept(message);
     }
   };
 
-  var exports = {};
-  exports.Connector = Connector;
-  return exports;
-});
+  internal.Connector = Connector;
+})();
diff --git a/mojo/public/js/new_bindings/interface_types.js b/mojo/public/js/new_bindings/interface_types.js
index 01ea2d1..f82789d2 100644
--- a/mojo/public/js/new_bindings/interface_types.js
+++ b/mojo/public/js/new_bindings/interface_types.js
@@ -2,10 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-define("mojo/public/js/interface_types", [
-  "mojo/public/js/core",
-], function(core) {
-
+(function() {
   // ---------------------------------------------------------------------------
 
   function InterfacePtrInfo(handle, version) {
@@ -14,14 +11,14 @@
   }
 
   InterfacePtrInfo.prototype.isValid = function() {
-    return core.isHandle(this.handle);
+    return this.handle instanceof MojoHandle;
   };
 
   InterfacePtrInfo.prototype.close = function() {
     if (!this.isValid())
       return;
 
-    core.close(this.handle);
+    this.handle.close();
     this.handle = null;
     this.version = 0;
   };
@@ -33,20 +30,17 @@
   }
 
   InterfaceRequest.prototype.isValid = function() {
-    return core.isHandle(this.handle);
+    return this.handle instanceof MojoHandle;
   };
 
   InterfaceRequest.prototype.close = function() {
     if (!this.isValid())
       return;
 
-    core.close(this.handle);
+    this.handle.close();
     this.handle = null;
   };
 
-  var exports = {};
-  exports.InterfacePtrInfo = InterfacePtrInfo;
-  exports.InterfaceRequest = InterfaceRequest;
-
-  return exports;
-});
+  mojoBindings.InterfacePtrInfo = InterfacePtrInfo;
+  mojoBindings.InterfaceRequest = InterfaceRequest;
+})();
diff --git a/mojo/public/js/new_bindings/lib/control_message_handler.js b/mojo/public/js/new_bindings/lib/control_message_handler.js
index 81d9002..bbd526ea 100644
--- a/mojo/public/js/new_bindings/lib/control_message_handler.js
+++ b/mojo/public/js/new_bindings/lib/control_message_handler.js
@@ -2,90 +2,88 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-define("mojo/public/js/lib/control_message_handler", [
-  "mojo/public/js/codec",
-  "mojo/public/interfaces/bindings/interface_control_messages.mojom",
-  "mojo/public/js/validator",
-], function(codec, controlMessages, validator) {
-
-  var Validator = validator.Validator;
+(function() {
+  var internal = mojoBindings.internal;
 
   function validateControlRequestWithResponse(message) {
-    var messageValidator = new Validator(message);
+    var messageValidator = new internal.Validator(message);
     var error = messageValidator.validateMessageIsRequestExpectingResponse();
-    if (error !== validator.validationError.NONE) {
+    if (error !== internal.validationError.NONE) {
       throw error;
     }
 
-    if (message.getName() != controlMessages.kRunMessageId) {
+    if (message.getName() != mojo.interface_control2.kRunMessageId) {
       throw new Error("Control message name is not kRunMessageId");
     }
 
     // Validate payload.
-    error = controlMessages.RunMessageParams.validate(messageValidator,
+    error = mojo.interface_control2.RunMessageParams.validate(messageValidator,
         message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
+    if (error != internal.validationError.NONE) {
       throw error;
     }
   }
 
   function validateControlRequestWithoutResponse(message) {
-    var messageValidator = new Validator(message);
+    var messageValidator = new internal.Validator(message);
     var error = messageValidator.validateMessageIsRequestWithoutResponse();
-    if (error != validator.validationError.NONE) {
+    if (error != internal.validationError.NONE) {
       throw error;
     }
 
-    if (message.getName() != controlMessages.kRunOrClosePipeMessageId) {
+    if (message.getName() != mojo.interface_control2.kRunOrClosePipeMessageId) {
       throw new Error("Control message name is not kRunOrClosePipeMessageId");
     }
 
     // Validate payload.
-    error = controlMessages.RunOrClosePipeMessageParams.validate(
+    error = mojo.interface_control2.RunOrClosePipeMessageParams.validate(
         messageValidator, message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
+    if (error != internal.validationError.NONE) {
       throw error;
     }
   }
 
   function runOrClosePipe(message, interface_version) {
-    var reader = new codec.MessageReader(message);
+    var reader = new internal.MessageReader(message);
     var runOrClosePipeMessageParams = reader.decodeStruct(
-        controlMessages.RunOrClosePipeMessageParams);
+        mojo.interface_control2.RunOrClosePipeMessageParams);
     return interface_version >=
         runOrClosePipeMessageParams.input.require_version.version;
   }
 
   function run(message, responder, interface_version) {
-    var reader = new codec.MessageReader(message);
+    var reader = new internal.MessageReader(message);
     var runMessageParams =
-        reader.decodeStruct(controlMessages.RunMessageParams);
+        reader.decodeStruct(mojo.interface_control2.RunMessageParams);
     var runOutput = null;
 
     if (runMessageParams.input.query_version) {
-      runOutput = new controlMessages.RunOutput();
+      runOutput = new mojo.interface_control2.RunOutput();
       runOutput.query_version_result = new
-          controlMessages.QueryVersionResult({'version': interface_version});
+          mojo.interface_control2.QueryVersionResult(
+              {'version': interface_version});
     }
 
     var runResponseMessageParams = new
-        controlMessages.RunResponseMessageParams();
+        mojo.interface_control2.RunResponseMessageParams();
     runResponseMessageParams.output = runOutput;
 
-    var messageName = controlMessages.kRunMessageId;
-    var payloadSize = controlMessages.RunResponseMessageParams.encodedSize;
+    var messageName = mojo.interface_control2.kRunMessageId;
+    var payloadSize =
+        mojo.interface_control2.RunResponseMessageParams.encodedSize;
     var requestID = reader.requestID;
-    var builder = new codec.MessageWithRequestIDBuilder(messageName,
-        payloadSize, codec.kMessageIsResponse, requestID);
-    builder.encodeStruct(controlMessages.RunResponseMessageParams,
+    var builder = new internal.MessageWithRequestIDBuilder(messageName,
+        payloadSize, internal.kMessageIsResponse, requestID);
+    builder.encodeStruct(mojo.interface_control2.RunResponseMessageParams,
                          runResponseMessageParams);
     responder.accept(builder.finish());
     return true;
   }
 
-  function isControlMessage(message) {
-    return message.getName() == controlMessages.kRunMessageId ||
-           message.getName() == controlMessages.kRunOrClosePipeMessageId;
+  function isInterfaceControlMessage(message) {
+    return message.getName() == mojo.interface_control2.kRunMessageId ||
+           message.getName() ==
+               mojo.interface_control2.kRunOrClosePipeMessageId;
   }
 
   function ControlMessageHandler(interface_version) {
@@ -103,9 +101,6 @@
     return run(message, responder, this.interface_version);
   };
 
-  var exports = {};
-  exports.ControlMessageHandler = ControlMessageHandler;
-  exports.isControlMessage = isControlMessage;
-
-  return exports;
-});
+  internal.ControlMessageHandler = ControlMessageHandler;
+  internal.isInterfaceControlMessage = isInterfaceControlMessage;
+})();
diff --git a/mojo/public/js/new_bindings/lib/control_message_proxy.js b/mojo/public/js/new_bindings/lib/control_message_proxy.js
index d6c0734f..53aa34d 100644
--- a/mojo/public/js/new_bindings/lib/control_message_proxy.js
+++ b/mojo/public/js/new_bindings/lib/control_message_proxy.js
@@ -2,39 +2,35 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-define("mojo/public/js/lib/control_message_proxy", [
-  "mojo/public/interfaces/bindings/interface_control_messages.mojom",
-  "mojo/public/js/codec",
-  "mojo/public/js/validator",
-], function(controlMessages, codec, validator) {
-
-  var Validator = validator.Validator;
+(function() {
+  var internal = mojoBindings.internal;
 
   function sendRunOrClosePipeMessage(receiver, runOrClosePipeMessageParams) {
-    var messageName = controlMessages.kRunOrClosePipeMessageId;
-    var payloadSize = controlMessages.RunOrClosePipeMessageParams.encodedSize;
-    var builder = new codec.MessageBuilder(messageName, payloadSize);
-    builder.encodeStruct(controlMessages.RunOrClosePipeMessageParams,
+    var messageName = mojo.interface_control2.kRunOrClosePipeMessageId;
+    var payloadSize =
+        mojo.interface_control2.RunOrClosePipeMessageParams.encodedSize;
+    var builder = new internal.MessageBuilder(messageName, payloadSize);
+    builder.encodeStruct(mojo.interface_control2.RunOrClosePipeMessageParams,
                          runOrClosePipeMessageParams);
     var message = builder.finish();
     receiver.accept(message);
   }
 
   function validateControlResponse(message) {
-    var messageValidator = new Validator(message);
+    var messageValidator = new internal.Validator(message);
     var error = messageValidator.validateMessageIsResponse();
-    if (error != validator.validationError.NONE) {
+    if (error != internal.validationError.NONE) {
       throw error;
     }
 
-    if (message.getName() != controlMessages.kRunMessageId) {
+    if (message.getName() != mojo.interface_control2.kRunMessageId) {
       throw new Error("Control message name is not kRunMessageId");
     }
 
     // Validate payload.
-    error = controlMessages.RunResponseMessageParams.validate(
+    error = mojo.interface_control2.RunResponseMessageParams.validate(
         messageValidator, message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
+    if (error != internal.validationError.NONE) {
       throw error;
     }
   }
@@ -42,9 +38,9 @@
   function acceptRunResponse(message) {
     validateControlResponse(message);
 
-    var reader = new codec.MessageReader(message);
+    var reader = new internal.MessageReader(message);
     var runResponseMessageParams = reader.decodeStruct(
-        controlMessages.RunResponseMessageParams);
+        mojo.interface_control2.RunResponseMessageParams);
 
     return Promise.resolve(runResponseMessageParams);
   }
@@ -59,12 +55,13 @@
   * @return {Promise} that resolves to a RunResponseMessageParams.
   */
   function sendRunMessage(receiver, runMessageParams) {
-    var messageName = controlMessages.kRunMessageId;
-    var payloadSize = controlMessages.RunMessageParams.encodedSize;
+    var messageName = mojo.interface_control2.kRunMessageId;
+    var payloadSize = mojo.interface_control2.RunMessageParams.encodedSize;
     // |requestID| is set to 0, but is later properly set by Router.
-    var builder = new codec.MessageWithRequestIDBuilder(messageName,
-        payloadSize, codec.kMessageExpectsResponse, 0);
-    builder.encodeStruct(controlMessages.RunMessageParams, runMessageParams);
+    var builder = new internal.MessageWithRequestIDBuilder(messageName,
+        payloadSize, internal.kMessageExpectsResponse, 0);
+    builder.encodeStruct(mojo.interface_control2.RunMessageParams,
+                         runMessageParams);
     var message = builder.finish();
 
     return receiver.acceptAndExpectResponse(message).then(acceptRunResponse);
@@ -75,9 +72,10 @@
   }
 
   ControlMessageProxy.prototype.queryVersion = function() {
-    var runMessageParams = new controlMessages.RunMessageParams();
-    runMessageParams.input = new controlMessages.RunInput();
-    runMessageParams.input.query_version = new controlMessages.QueryVersion();
+    var runMessageParams = new mojo.interface_control2.RunMessageParams();
+    runMessageParams.input = new mojo.interface_control2.RunInput();
+    runMessageParams.input.query_version =
+        new mojo.interface_control2.QueryVersion();
 
     return sendRunMessage(this.receiver, runMessageParams).then(function(
         runResponseMessageParams) {
@@ -87,16 +85,13 @@
 
   ControlMessageProxy.prototype.requireVersion = function(version) {
     var runOrClosePipeMessageParams = new
-        controlMessages.RunOrClosePipeMessageParams();
+        mojo.interface_control2.RunOrClosePipeMessageParams();
     runOrClosePipeMessageParams.input = new
-        controlMessages.RunOrClosePipeInput();
+        mojo.interface_control2.RunOrClosePipeInput();
     runOrClosePipeMessageParams.input.require_version = new
-        controlMessages.RequireVersion({'version': version});
+        mojo.interface_control2.RequireVersion({'version': version});
     sendRunOrClosePipeMessage(this.receiver, runOrClosePipeMessageParams);
   };
 
-  var exports = {};
-  exports.ControlMessageProxy = ControlMessageProxy;
-
-  return exports;
-});
+  internal.ControlMessageProxy = ControlMessageProxy;
+})();
diff --git a/mojo/public/js/new_bindings/router.js b/mojo/public/js/new_bindings/router.js
index e94c5eb..61b3395 100644
--- a/mojo/public/js/new_bindings/router.js
+++ b/mojo/public/js/new_bindings/router.js
@@ -2,25 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-define("mojo/public/js/router", [
-  "console",
-  "mojo/public/js/codec",
-  "mojo/public/js/core",
-  "mojo/public/js/connector",
-  "mojo/public/js/lib/control_message_handler",
-  "mojo/public/js/validator",
-], function(console, codec, core, connector, controlMessageHandler, validator) {
-
-  var Connector = connector.Connector;
-  var MessageReader = codec.MessageReader;
-  var Validator = validator.Validator;
-  var ControlMessageHandler = controlMessageHandler.ControlMessageHandler;
+(function() {
+  var internal = mojoBindings.internal;
 
   function Router(handle, interface_version, connectorFactory) {
-    if (!core.isHandle(handle))
+    if (!(handle instanceof MojoHandle))
       throw new Error("Router constructor: Not a handle");
     if (connectorFactory === undefined)
-      connectorFactory = Connector;
+      connectorFactory = internal.Connector;
     this.connector_ = new connectorFactory(handle);
     this.incomingReceiver_ = null;
     this.errorHandler_ = null;
@@ -31,7 +20,7 @@
 
     if (interface_version !== undefined) {
       this.controlMessageHandler_ = new
-          ControlMessageHandler(interface_version);
+          internal.ControlMessageHandler(interface_version);
     }
 
     this.connector_.setIncomingReceiver({
@@ -97,8 +86,8 @@
   };
 
   Router.prototype.handleIncomingMessage_ = function(message) {
-    var noError = validator.validationError.NONE;
-    var messageValidator = new Validator(message);
+    var noError = internal.validationError.NONE;
+    var messageValidator = new internal.Validator(message);
     var err = messageValidator.validateMessageHeader();
     for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i)
       err = this.payloadValidators_[i](messageValidator);
@@ -114,7 +103,7 @@
       return;
 
     if (message.expectsResponse()) {
-      if (controlMessageHandler.isControlMessage(message)) {
+      if (internal.isInterfaceControlMessage(message)) {
         if (this.controlMessageHandler_) {
           this.controlMessageHandler_.acceptWithResponder(message, this);
         } else {
@@ -128,7 +117,7 @@
         this.close();
       }
     } else if (message.isResponse()) {
-      var reader = new MessageReader(message);
+      var reader = new internal.MessageReader(message);
       var requestID = reader.requestID;
       var completer = this.completers_.get(requestID);
       if (completer) {
@@ -138,7 +127,7 @@
         console.log("Unexpected response with request ID: " + requestID);
       }
     } else {
-      if (controlMessageHandler.isControlMessage(message)) {
+      if (internal.isInterfaceControlMessage(message)) {
         if (this.controlMessageHandler_) {
           var ok = this.controlMessageHandler_.accept(message);
           if (ok) return;
@@ -156,7 +145,7 @@
       // TODO(yzshen): This should also trigger connection error handler.
       // Consider making accept() return a boolean and let the connector deal
       // with this, as the C++ code does.
-      console.log("Invalid message: " + validator.validationError[error]);
+      console.log("Invalid message: " + internal.validationError[error]);
 
       this.close();
       return;
@@ -197,7 +186,5 @@
       this.invalidMessageHandler_(error);
   };
 
-  var exports = {};
-  exports.Router = Router;
-  return exports;
-});
+  internal.Router = Router;
+})();
diff --git a/mojo/public/js/new_bindings/unicode.js b/mojo/public/js/new_bindings/unicode.js
index be2ba0e..a3c0df7 100644
--- a/mojo/public/js/new_bindings/unicode.js
+++ b/mojo/public/js/new_bindings/unicode.js
@@ -7,7 +7,9 @@
  * stored in ArrayBuffers. There is much room for optimization in this code if
  * it proves necessary.
  */
-define("mojo/public/js/unicode", function() {
+(function() {
+  var internal = mojoBindings.internal;
+
   /**
    * Decodes the UTF8 string from the given buffer.
    * @param {ArrayBufferView} buffer The buffer containing UTF8 string data.
@@ -43,9 +45,7 @@
     return utf8String.length;
   }
 
-  var exports = {};
-  exports.decodeUtf8String = decodeUtf8String;
-  exports.encodeUtf8String = encodeUtf8String;
-  exports.utf8Length = utf8Length;
-  return exports;
-});
+  internal.decodeUtf8String = decodeUtf8String;
+  internal.encodeUtf8String = encodeUtf8String;
+  internal.utf8Length = utf8Length;
+})();
diff --git a/mojo/public/js/new_bindings/validator.js b/mojo/public/js/new_bindings/validator.js
index fee742d0..e960552 100644
--- a/mojo/public/js/new_bindings/validator.js
+++ b/mojo/public/js/new_bindings/validator.js
@@ -2,9 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-define("mojo/public/js/validator", [
-  "mojo/public/js/codec",
-], function(codec) {
+(function() {
+  var internal = mojoBindings.internal;
 
   var validationError = {
     NONE: 'VALIDATION_ERROR_NONE',
@@ -30,32 +29,33 @@
   var NULL_MOJO_POINTER = "NULL_MOJO_POINTER";
 
   function isEnumClass(cls) {
-    return cls instanceof codec.Enum;
+    return cls instanceof internal.Enum;
   }
 
   function isStringClass(cls) {
-    return cls === codec.String || cls === codec.NullableString;
+    return cls === internal.String || cls === internal.NullableString;
   }
 
   function isHandleClass(cls) {
-    return cls === codec.Handle || cls === codec.NullableHandle;
+    return cls === internal.Handle || cls === internal.NullableHandle;
   }
 
   function isInterfaceClass(cls) {
-    return cls instanceof codec.Interface;
+    return cls instanceof internal.Interface;
   }
 
   function isInterfaceRequestClass(cls) {
-    return cls === codec.InterfaceRequest ||
-        cls === codec.NullableInterfaceRequest;
+    return cls === internal.InterfaceRequest ||
+        cls === internal.NullableInterfaceRequest;
   }
 
   function isNullable(type) {
-    return type === codec.NullableString || type === codec.NullableHandle ||
-        type === codec.NullableInterface ||
-        type === codec.NullableInterfaceRequest ||
-        type instanceof codec.NullableArrayOf ||
-        type instanceof codec.NullablePointerTo;
+    return type === internal.NullableString ||
+        type === internal.NullableHandle ||
+        type === internal.NullableInterface ||
+        type === internal.NullableInterfaceRequest ||
+        type instanceof internal.NullableArrayOf ||
+        type instanceof internal.NullablePointerTo;
   }
 
   function Validator(message) {
@@ -98,7 +98,7 @@
   };
 
   Validator.prototype.claimHandle = function(index) {
-    if (index === codec.kEncodedInvalidHandleValue)
+    if (index === internal.kEncodedInvalidHandleValue)
       return true;
 
     if (index < this.handleIndex || index >= this.handleIndexLimit)
@@ -119,7 +119,7 @@
   Validator.prototype.validateHandle = function(offset, nullable) {
     var index = this.message.buffer.getUint32(offset);
 
-    if (index === codec.kEncodedInvalidHandleValue)
+    if (index === internal.kEncodedInvalidHandleValue)
       return nullable ?
           validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE;
 
@@ -138,10 +138,10 @@
   };
 
   Validator.prototype.validateStructHeader = function(offset, minNumBytes) {
-    if (!codec.isAligned(offset))
+    if (!internal.isAligned(offset))
       return validationError.MISALIGNED_OBJECT;
 
-    if (!this.isValidRange(offset, codec.kStructHeaderSize))
+    if (!this.isValidRange(offset, internal.kStructHeaderSize))
       return validationError.ILLEGAL_MEMORY_RANGE;
 
     var numBytes = this.message.buffer.getUint32(offset);
@@ -182,7 +182,7 @@
 
   Validator.prototype.validateMessageHeader = function() {
 
-    var err = this.validateStructHeader(0, codec.kMessageHeaderSize);
+    var err = this.validateStructHeader(0, internal.kMessageHeaderSize);
     if (err != validationError.NONE)
       return err;
 
@@ -190,11 +190,11 @@
     var version = this.message.getHeaderVersion();
 
     var validVersionAndNumBytes =
-        (version == 0 && numBytes == codec.kMessageHeaderSize) ||
+        (version == 0 && numBytes == internal.kMessageHeaderSize) ||
         (version == 1 &&
-         numBytes == codec.kMessageWithRequestIDHeaderSize) ||
+         numBytes == internal.kMessageWithRequestIDHeaderSize) ||
         (version > 1 &&
-         numBytes >= codec.kMessageWithRequestIDHeaderSize);
+         numBytes >= internal.kMessageWithRequestIDHeaderSize);
     if (!validVersionAndNumBytes)
       return validationError.UNEXPECTED_STRUCT_HEADER;
 
@@ -322,13 +322,14 @@
       return mapIsNullable ?
           validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
 
-    var mapEncodedSize = codec.kStructHeaderSize + codec.kMapStructPayloadSize;
+    var mapEncodedSize = internal.kStructHeaderSize +
+        internal.kMapStructPayloadSize;
     var err = this.validateStructHeader(structOffset, mapEncodedSize);
     if (err !== validationError.NONE)
         return err;
 
     // Validate the keys array.
-    var keysArrayPointerOffset = structOffset + codec.kStructHeaderSize;
+    var keysArrayPointerOffset = structOffset + internal.kStructHeaderSize;
     err = this.validateArrayPointer(
         keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0);
     if (err !== validationError.NONE)
@@ -337,7 +338,7 @@
     // Validate the values array.
     var valuesArrayPointerOffset = keysArrayPointerOffset + 8;
     var valuesArrayDimensions = [0]; // Validate the actual length below.
-    if (valueClass instanceof codec.ArrayOf)
+    if (valueClass instanceof internal.ArrayOf)
       valuesArrayDimensions =
           valuesArrayDimensions.concat(valueClass.dimensions());
     var err = this.validateArrayPointer(valuesArrayPointerOffset,
@@ -360,7 +361,7 @@
 
   Validator.prototype.validateStringPointer = function(offset, nullable) {
     return this.validateArrayPointer(
-        offset, codec.Uint8.encodedSize, codec.Uint8, nullable, [0], 0);
+        offset, internal.Uint8.encodedSize, internal.Uint8, nullable, [0], 0);
   };
 
   // Similar to Array_Data<T>::Validate()
@@ -369,10 +370,10 @@
   Validator.prototype.validateArray =
       function (offset, elementSize, elementType, expectedDimensionSizes,
                 currentDimension) {
-    if (!codec.isAligned(offset))
+    if (!internal.isAligned(offset))
       return validationError.MISALIGNED_OBJECT;
 
-    if (!this.isValidRange(offset, codec.kArrayHeaderSize))
+    if (!this.isValidRange(offset, internal.kArrayHeaderSize))
       return validationError.ILLEGAL_MEMORY_RANGE;
 
     var numBytes = this.message.buffer.getUint32(offset);
@@ -380,10 +381,10 @@
 
     // Note: this computation is "safe" because elementSize <= 8 and
     // numElements is a uint32.
-    var elementsTotalSize = (elementType === codec.PackedBool) ?
+    var elementsTotalSize = (elementType === internal.PackedBool) ?
         Math.ceil(numElements / 8) : (elementSize * numElements);
 
-    if (numBytes < codec.kArrayHeaderSize + elementsTotalSize)
+    if (numBytes < internal.kArrayHeaderSize + elementsTotalSize)
       return validationError.UNEXPECTED_ARRAY_HEADER;
 
     if (expectedDimensionSizes[currentDimension] != 0 &&
@@ -396,7 +397,7 @@
 
     // Validate the array's elements if they are pointers or handles.
 
-    var elementsOffset = offset + codec.kArrayHeaderSize;
+    var elementsOffset = offset + internal.kArrayHeaderSize;
     var nullable = isNullable(elementType);
 
     if (isHandleClass(elementType))
@@ -409,11 +410,11 @@
           elementsOffset, numElements, nullable);
     if (isStringClass(elementType))
       return this.validateArrayElements(
-          elementsOffset, numElements, codec.Uint8, nullable, [0], 0);
-    if (elementType instanceof codec.PointerTo)
+          elementsOffset, numElements, internal.Uint8, nullable, [0], 0);
+    if (elementType instanceof internal.PointerTo)
       return this.validateStructElements(
           elementsOffset, numElements, elementType.cls, nullable);
-    if (elementType instanceof codec.ArrayOf)
+    if (elementType instanceof internal.ArrayOf)
       return this.validateArrayElements(
           elementsOffset, numElements, elementType.cls, nullable,
           expectedDimensionSizes, currentDimension + 1);
@@ -430,7 +431,7 @@
 
   Validator.prototype.validateHandleElements =
       function(offset, numElements, nullable) {
-    var elementSize = codec.Handle.encodedSize;
+    var elementSize = internal.Handle.encodedSize;
     for (var i = 0; i < numElements; i++) {
       var elementOffset = offset + i * elementSize;
       var err = this.validateHandle(elementOffset, nullable);
@@ -442,7 +443,7 @@
 
   Validator.prototype.validateInterfaceElements =
       function(offset, numElements, nullable) {
-    var elementSize = codec.Interface.prototype.encodedSize;
+    var elementSize = internal.Interface.prototype.encodedSize;
     for (var i = 0; i < numElements; i++) {
       var elementOffset = offset + i * elementSize;
       var err = this.validateInterface(elementOffset, nullable);
@@ -454,7 +455,7 @@
 
   Validator.prototype.validateInterfaceRequestElements =
       function(offset, numElements, nullable) {
-    var elementSize = codec.InterfaceRequest.encodedSize;
+    var elementSize = internal.InterfaceRequest.encodedSize;
     for (var i = 0; i < numElements; i++) {
       var elementOffset = offset + i * elementSize;
       var err = this.validateInterfaceRequest(elementOffset, nullable);
@@ -468,7 +469,7 @@
   Validator.prototype.validateArrayElements =
       function(offset, numElements, elementClass, nullable,
                expectedDimensionSizes, currentDimension) {
-    var elementSize = codec.PointerTo.prototype.encodedSize;
+    var elementSize = internal.PointerTo.prototype.encodedSize;
     for (var i = 0; i < numElements; i++) {
       var elementOffset = offset + i * elementSize;
       var err = this.validateArrayPointer(
@@ -482,7 +483,7 @@
 
   Validator.prototype.validateStructElements =
       function(offset, numElements, structClass, nullable) {
-    var elementSize = codec.PointerTo.prototype.encodedSize;
+    var elementSize = internal.PointerTo.prototype.encodedSize;
     for (var i = 0; i < numElements; i++) {
       var elementOffset = offset + i * elementSize;
       var err =
@@ -495,7 +496,7 @@
 
   Validator.prototype.validateEnumElements =
       function(offset, numElements, enumClass) {
-    var elementSize = codec.Enum.prototype.encodedSize;
+    var elementSize = internal.Enum.prototype.encodedSize;
     for (var i = 0; i < numElements; i++) {
       var elementOffset = offset + i * elementSize;
       var err = this.validateEnum(elementOffset, enumClass);
@@ -505,8 +506,6 @@
     return validationError.NONE;
   };
 
-  var exports = {};
-  exports.validationError = validationError;
-  exports.Validator = Validator;
-  return exports;
-});
+  internal.validationError = validationError;
+  internal.Validator = Validator;
+})();
diff --git a/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl b/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl
index 3ce4ab6..f04ee99 100644
--- a/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl
+++ b/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl
@@ -2,26 +2,63 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+{%- if use_new_js_bindings %}
+
+'use strict';
+
+(function() {
+  var mojomId = '{{module.path}}';
+  if (mojoBindings.internal.isMojomLoaded(mojomId)) {
+    console.warn('The following mojom is loaded multiple times: ' + mojomId);
+    return;
+  }
+  mojoBindings.internal.markMojomLoaded(mojomId);
+
+  // TODO(yzshen): Define these aliases to minimize the differences between the
+  // old/new modes. Remove them when the old mode goes away.
+  var bindings = mojoBindings;
+  var codec = mojoBindings.internal;
+  var validator = mojoBindings.internal;
+
+{%-   for import in imports %}
+  var {{import.unique_name}} =
+      mojoBindings.internal.exposeNamespace('{{import.module.namespace}}');
+  if (mojoBindings.config.autoLoadMojomDeps) {
+    mojoBindings.internal.loadMojomIfNecessary(
+        '{{import.module.path}}',
+        new URL(
+            '{{import.module|get_relative_path(module)}}.js',
+            document.currentScript.src).href);
+  }
+{%-   endfor %}
+
+{% include "module_definition.tmpl" %}
+})();
+
+{%- else %}
+
 define("{{module.path}}", [
-{%- if module.path != "mojo/public/interfaces/bindings/interface_control_messages.mojom" %}
+{%-   if module.path != "mojo/public/interfaces/bindings/interface_control_messages.mojom" %}
     "mojo/public/js/bindings",
-{%- endif %}
+{%-   endif %}
     "mojo/public/js/codec",
     "mojo/public/js/core",
     "mojo/public/js/validator",
-{%- for import in imports %}
+{%-   for import in imports %}
     "{{import.module.path}}",
-{%- endfor %}
+{%-   endfor %}
 ], function(
 {%- if module.path != "mojo/public/interfaces/bindings/interface_control_messages.mojom" -%}
 bindings, {% endif -%}
 codec, core, validator
-{%- for import in imports -%}
+{%-   for import in imports -%}
     , {{import.unique_name}}
-{%- endfor -%}
+{%-   endfor -%}
 ) {
 
 {%- include "module_definition.tmpl" %}
 
   return exports;
 });
+
+{%- endif %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl
index ddfef72..5abcf34f 100644
--- a/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl
@@ -1,5 +1,5 @@
 {#--- Constants #}
-{%-  for constant in module.constants %}
+{%- for constant in module.constants %}
   var {{constant.name}} = {{constant.value|expression_to_text}};
 {%- endfor %}
 
@@ -25,8 +25,13 @@
 {%-   include "interface_definition.tmpl" %}
 {%- endfor %}
 
+{%- if use_new_js_bindings %}
+  var exports = mojoBindings.internal.exposeNamespace("{{module.namespace}}");
+{%- else %}
   var exports = {};
-{%-  for constant in module.constants %}
+{%- endif %}
+
+{%- for constant in module.constants %}
   exports.{{constant.name}} = {{constant.name}};
 {%- endfor %}
 {%- for enum in enums %}
@@ -41,10 +46,4 @@
 {%- for interface in interfaces %}
   exports.{{interface.name}} = {{interface.name}};
   exports.{{interface.name}}Ptr = {{interface.name}}Ptr;
-{#--- Interface Client #}
-{%-   if interface.client in interfaces|map(attribute='name') %}
-  exports.{{interface.name}}.client = {{interface.client}};
-{%-   elif interface.client in imported_interfaces %}
-  exports.{{interface.name}}.client = {{imported_interfaces[interface.client]}};
-{%-   endif %}
 {%- endfor %}
diff --git a/mojo/public/tools/bindings/generators/mojom_js_generator.py b/mojo/public/tools/bindings/generators/mojom_js_generator.py
index 0eedb31..ab9635e 100644
--- a/mojo/public/tools/bindings/generators/mojom_js_generator.py
+++ b/mojo/public/tools/bindings/generators/mojom_js_generator.py
@@ -7,6 +7,7 @@
 import mojom.generate.generator as generator
 import mojom.generate.module as mojom
 import mojom.generate.pack as pack
+import os
 from mojom.generate.template_expander import UseJinja
 
 _kind_to_javascript_default_value = {
@@ -324,6 +325,9 @@
 def IsEnumField(field):
   return mojom.IsEnumKind(field.kind)
 
+def GetRelativePath(module, base_module):
+  return os.path.relpath(module.path, os.path.dirname(base_module.path))
+
 
 class Generator(generator.Generator):
 
@@ -348,6 +352,7 @@
     "is_union_field": IsUnionField,
     "js_type": JavaScriptType,
     "payload_size": JavaScriptPayloadSize,
+    "get_relative_path": GetRelativePath,
     "stylize_method": generator.StudlyCapsToCamel,
     "union_decode_snippet": JavaScriptUnionDecodeSnippet,
     "union_encode_snippet": JavaScriptUnionEncodeSnippet,
@@ -368,6 +373,7 @@
       "module": self.module,
       "structs": self.GetStructs() + self.GetStructsFromMethods(),
       "unions": self.GetUnions(),
+      "use_new_js_bindings": self.use_new_js_bindings,
       "interfaces": self.GetInterfaces(),
       "imported_interfaces": self.GetImportedInterfaces(),
     }
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni
index 2466636..4a244fb5 100644
--- a/mojo/public/tools/bindings/mojom.gni
+++ b/mojo/public/tools/bindings/mojom.gni
@@ -134,6 +134,13 @@
 #   cpp_only (optional)
 #       If set to true, only the C++ bindings targets will be generated.
 #
+#   use_new_js_bindings (optional)
+#       If set to true, the generated JS code will use the new module loading
+#       approach and the core API exposed by Web IDL.
+#
+#       TODO(yzshen): Switch all existing users to use_new_js_bindings=true and
+#       remove the old mode.
+#
 # The following parameters are used to support the component build. They are
 # needed so that bindings which are linked with a component can use the same
 # export settings for classes. The first three are for the chromium variant, and
@@ -434,6 +441,11 @@
         if (defined(invoker.use_once_callback) && invoker.use_once_callback) {
           args += [ "--use_once_callback" ]
         }
+
+        if (defined(invoker.use_new_js_bindings) &&
+            invoker.use_new_js_bindings) {
+          args += [ "--use_new_js_bindings" ]
+        }
       }
     }
 
diff --git a/mojo/public/tools/bindings/mojom_bindings_generator.py b/mojo/public/tools/bindings/mojom_bindings_generator.py
index 3a0b6fc8..a9650d7 100755
--- a/mojo/public/tools/bindings/mojom_bindings_generator.py
+++ b/mojo/public/tools/bindings/mojom_bindings_generator.py
@@ -167,6 +167,7 @@
             variant=args.variant, bytecode_path=args.bytecode_path,
             for_blink=args.for_blink,
             use_once_callback=args.use_once_callback,
+            use_new_js_bindings=args.use_new_js_bindings,
             export_attribute=args.export_attribute,
             export_header=args.export_header,
             generate_non_variant_code=args.generate_non_variant_code)
@@ -298,6 +299,10 @@
       "--use_once_callback", action="store_true",
       help="Use base::OnceCallback instead of base::RepeatingCallback.")
   generate_parser.add_argument(
+      "--use_new_js_bindings", action="store_true",
+      help="Use the new module loading approach and the core API exposed by "
+      "Web IDL. This option only affects the JavaScript bindings.")
+  generate_parser.add_argument(
       "--export_attribute", type=str, default="",
       help="Optional attribute to specify on class declaration to export it "
       "for the component build.")
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py
index e4ab3735..0e64af7 100644
--- a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py
+++ b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py
@@ -38,8 +38,8 @@
   # files to stdout.
   def __init__(self, module, output_dir=None, typemap=None, variant=None,
                bytecode_path=None, for_blink=False, use_once_callback=False,
-               export_attribute=None, export_header=None,
-               generate_non_variant_code=False):
+               use_new_js_bindings=False, export_attribute=None,
+               export_header=None, generate_non_variant_code=False):
     self.module = module
     self.output_dir = output_dir
     self.typemap = typemap or {}
@@ -47,6 +47,7 @@
     self.bytecode_path = bytecode_path
     self.for_blink = for_blink
     self.use_once_callback = use_once_callback
+    self.use_new_js_bindings = use_new_js_bindings
     self.export_attribute = export_attribute
     self.export_header = export_header
     self.generate_non_variant_code = generate_non_variant_code
diff --git a/net/android/network_change_notifier_android.cc b/net/android/network_change_notifier_android.cc
index e093a4f..cc98d5a3 100644
--- a/net/android/network_change_notifier_android.cc
+++ b/net/android/network_change_notifier_android.cc
@@ -160,6 +160,11 @@
   return delegate_->GetCurrentConnectionType();
 }
 
+NetworkChangeNotifier::ConnectionSubtype
+NetworkChangeNotifierAndroid::GetCurrentConnectionSubtype() const {
+  return delegate_->GetCurrentConnectionSubtype();
+}
+
 void NetworkChangeNotifierAndroid::GetCurrentMaxBandwidthAndConnectionType(
     double* max_bandwidth_mbps,
     ConnectionType* connection_type) const {
diff --git a/net/android/network_change_notifier_android.h b/net/android/network_change_notifier_android.h
index 41366b9..80f978c 100644
--- a/net/android/network_change_notifier_android.h
+++ b/net/android/network_change_notifier_android.h
@@ -59,6 +59,8 @@
   void GetCurrentConnectedNetworks(NetworkList* network_list) const override;
   ConnectionType GetCurrentNetworkConnectionType(
       NetworkHandle network) const override;
+  NetworkChangeNotifier::ConnectionSubtype GetCurrentConnectionSubtype()
+      const override;
   NetworkHandle GetCurrentDefaultNetwork() const override;
 
   // NetworkChangeNotifierDelegateAndroid::Observer:
diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc
index 0cfaaa3..f5bfa8cb 100644
--- a/net/base/network_change_notifier.cc
+++ b/net/base/network_change_notifier.cc
@@ -547,6 +547,14 @@
 }
 
 // static
+NetworkChangeNotifier::ConnectionSubtype
+NetworkChangeNotifier::GetConnectionSubtype() {
+  return g_network_change_notifier
+             ? g_network_change_notifier->GetCurrentConnectionSubtype()
+             : SUBTYPE_UNKNOWN;
+}
+
+// static
 void NetworkChangeNotifier::GetMaxBandwidthAndConnectionType(
     double* max_bandwidth_mbps,
     ConnectionType* connection_type) {
@@ -985,6 +993,11 @@
 }
 #endif
 
+NetworkChangeNotifier::ConnectionSubtype
+NetworkChangeNotifier::GetCurrentConnectionSubtype() const {
+  return SUBTYPE_UNKNOWN;
+}
+
 void NetworkChangeNotifier::GetCurrentMaxBandwidthAndConnectionType(
     double* max_bandwidth_mbps,
     ConnectionType* connection_type) const {
diff --git a/net/base/network_change_notifier.h b/net/base/network_change_notifier.h
index 1cefe85f..2d5529f 100644
--- a/net/base/network_change_notifier.h
+++ b/net/base/network_change_notifier.h
@@ -270,12 +270,18 @@
   // value doesn't imply that the user will be able to connect to remote sites;
   // even if some link is up, it is uncertain whether a particular connection
   // attempt to a particular remote site will be successful.
-  // The returned value only describes the connection currently used by the
-  // device, and does not take into account other machines on the network. For
-  // example, if the device is connected using Wifi to a 3G gateway to access
-  // the internet, the connection type is CONNECTION_WIFI.
+  // The returned value only describes the first-hop connection, for example if
+  // the device is connected via WiFi to a 4G hotspot, the returned value will
+  // be CONNECTION_WIFI, not CONNECTION_4G.
   static ConnectionType GetConnectionType();
 
+  // Returns the device's current default active network connection's subtype.
+  // The returned value only describes the first-hop connection, for example if
+  // the device is connected via WiFi to a 4G hotspot, the returned value will
+  // reflect WiFi, not 4G. This method may return SUBTYPE_UNKNOWN even if the
+  // connection type is known.
+  static ConnectionSubtype GetConnectionSubtype();
+
   // Sets |max_bandwidth_mbps| to a theoretical upper limit on download
   // bandwidth, potentially based on underlying connection type, signal
   // strength, or some other signal. If the network subtype is unknown then
@@ -498,6 +504,7 @@
   // Implementations must be thread-safe. Implementations must also be
   // cheap as they are called often.
   virtual ConnectionType GetCurrentConnectionType() const = 0;
+  virtual ConnectionSubtype GetCurrentConnectionSubtype() const;
   virtual void GetCurrentMaxBandwidthAndConnectionType(
       double* max_bandwidth_mbps,
       ConnectionType* connection_type) const;
diff --git a/net/base/network_change_notifier_unittest.cc b/net/base/network_change_notifier_unittest.cc
index 67426078..c06d358 100644
--- a/net/base/network_change_notifier_unittest.cc
+++ b/net/base/network_change_notifier_unittest.cc
@@ -123,4 +123,9 @@
             NetworkChangeNotifier::ConnectionTypeFromInterfaceList(list));
 }
 
+TEST(NetworkChangeNotifierTest, GetConnectionSubtype) {
+  // Call GetConnectionSubtype() and ensure that there is no crash.
+  NetworkChangeNotifier::GetConnectionSubtype();
+}
+
 }  // namespace net
diff --git a/net/spdy/spdy_protocol.h b/net/spdy/spdy_protocol.h
index fc23a89..70fab32 100644
--- a/net/spdy/spdy_protocol.h
+++ b/net/spdy/spdy_protocol.h
@@ -596,7 +596,6 @@
   ~SpdyGoAwayIR() override;
   SpdyStreamId last_good_stream_id() const { return last_good_stream_id_; }
   void set_last_good_stream_id(SpdyStreamId last_good_stream_id) {
-    DCHECK_LE(0u, last_good_stream_id);
     DCHECK_EQ(0u, last_good_stream_id & ~kStreamIdMask);
     last_good_stream_id_ = last_good_stream_id;
   }
diff --git a/ppapi/nacl_irt/ppapi_dispatcher.cc b/ppapi/nacl_irt/ppapi_dispatcher.cc
index 789a75c..460dbec 100644
--- a/ppapi/nacl_irt/ppapi_dispatcher.cc
+++ b/ppapi/nacl_irt/ppapi_dispatcher.cc
@@ -165,9 +165,6 @@
   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
   logging::InitLogging(settings);
 
-  proxy::PluginGlobals::Get()->set_keepalive_throttle_interval_milliseconds(
-      args.keepalive_throttle_interval_milliseconds);
-
   // Tell the process-global GetInterface which interfaces it can return to the
   // plugin.
   proxy::InterfaceList::SetProcessGlobalPermissions(args.permissions);
diff --git a/ppapi/proxy/plugin_globals.cc b/ppapi/proxy/plugin_globals.cc
index f2ee4ef..862031a 100644
--- a/ppapi/proxy/plugin_globals.cc
+++ b/ppapi/proxy/plugin_globals.cc
@@ -64,9 +64,6 @@
       resource_reply_thread_registrar_(
           new ResourceReplyThreadRegistrar(GetMainThreadMessageLoop())),
       udp_socket_filter_(new UDPSocketFilter()),
-      plugin_recently_active_(false),
-      keepalive_throttle_interval_milliseconds_(
-          ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds),
       weak_factory_(this) {
   DCHECK(!plugin_globals_);
   plugin_globals_ = this;
@@ -88,9 +85,6 @@
       ipc_task_runner_(ipc_task_runner),
       resource_reply_thread_registrar_(
           new ResourceReplyThreadRegistrar(GetMainThreadMessageLoop())),
-      plugin_recently_active_(false),
-      keepalive_throttle_interval_milliseconds_(
-          kKeepaliveThrottleIntervalDefaultMilliseconds),
       weak_factory_(this) {
   DCHECK(!plugin_globals_);
 }
@@ -185,22 +179,6 @@
   return file_thread_->task_runner().get();
 }
 
-void PluginGlobals::MarkPluginIsActive() {
-  if (!plugin_recently_active_) {
-    plugin_recently_active_ = true;
-    if (!GetBrowserSender() || !base::ThreadTaskRunnerHandle::IsSet())
-      return;
-    GetBrowserSender()->Send(new PpapiHostMsg_Keepalive());
-    DCHECK(keepalive_throttle_interval_milliseconds_);
-    GetMainThreadMessageLoop()->PostDelayedTask(
-        FROM_HERE,
-        RunWhileLocked(base::Bind(&PluginGlobals::OnReleaseKeepaliveThrottle,
-                                  weak_factory_.GetWeakPtr())),
-        base::TimeDelta::FromMilliseconds(
-            keepalive_throttle_interval_milliseconds_));
-  }
-}
-
 IPC::Sender* PluginGlobals::GetBrowserSender() {
   // CAUTION: This function is called without the ProxyLock. See also
   // InterfaceList::GetInterfaceForPPB.
@@ -251,18 +229,9 @@
   plugin_filter->AddResourceMessageFilter(udp_socket_filter_.get());
 }
 
-void PluginGlobals::set_keepalive_throttle_interval_milliseconds(unsigned i) {
-  keepalive_throttle_interval_milliseconds_ = i;
-}
-
 bool PluginGlobals::IsPluginGlobals() const {
   return true;
 }
 
-void PluginGlobals::OnReleaseKeepaliveThrottle() {
-  ppapi::ProxyLock::AssertAcquiredDebugOnly();
-  plugin_recently_active_ = false;
-}
-
 }  // namespace proxy
 }  // namespace ppapi
diff --git a/ppapi/proxy/plugin_globals.h b/ppapi/proxy/plugin_globals.h
index 2821ce7..09ce0d6b 100644
--- a/ppapi/proxy/plugin_globals.h
+++ b/ppapi/proxy/plugin_globals.h
@@ -77,7 +77,6 @@
                               const std::string& value) override;
   MessageLoopShared* GetCurrentMessageLoop() override;
   base::TaskRunner* GetFileTaskRunner() override;
-  void MarkPluginIsActive() override;
 
   // Returns the channel for sending to the browser.
   IPC::Sender* GetBrowserSender();
@@ -149,20 +148,12 @@
   void RegisterResourceMessageFilters(
       ppapi::proxy::PluginMessageFilter* plugin_filter);
 
-  // Interval to limit how many IPC messages are sent indicating that the plugin
-  // is active and should be kept alive. The value must be smaller than any
-  // threshold used to kill inactive plugins by the embedder host.
-  void set_keepalive_throttle_interval_milliseconds(unsigned i);
-
  private:
   class BrowserSender;
 
   // PpapiGlobals overrides.
   bool IsPluginGlobals() const override;
 
-  // Locks the proxy lock and releases the throttle on keepalive IPC messages.
-  void OnReleaseKeepaliveThrottle();
-
   static PluginGlobals* plugin_globals_;
 
   PluginProxyDelegate* plugin_proxy_delegate_;
@@ -195,14 +186,6 @@
 
   scoped_refptr<UDPSocketFilter> udp_socket_filter_;
 
-  // Indicates activity by the plugin. Used to monitor when a plugin can be
-  // shutdown due to idleness. Current needs do not require differentiating
-  // between idle state between multiple instances, if any are active they are
-  // all considered active.
-  bool plugin_recently_active_;
-
-  unsigned keepalive_throttle_interval_milliseconds_;
-
   // Member variables should appear before the WeakPtrFactory, see weak_ptr.h.
   base::WeakPtrFactory<PluginGlobals> weak_factory_;
 
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index 36d6d87..c99a276 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -474,7 +474,6 @@
 IPC_STRUCT_TRAITS_BEGIN(ppapi::PpapiNaClPluginArgs)
   IPC_STRUCT_TRAITS_MEMBER(off_the_record)
   IPC_STRUCT_TRAITS_MEMBER(permissions)
-  IPC_STRUCT_TRAITS_MEMBER(keepalive_throttle_interval_milliseconds)
   IPC_STRUCT_TRAITS_MEMBER(switch_names)
   IPC_STRUCT_TRAITS_MEMBER(switch_values)
 IPC_STRUCT_TRAITS_END()
@@ -963,10 +962,7 @@
                             /* success status result */
                             bool)
 
-// Reports to the browser that a plugin has been active.
-IPC_MESSAGE_CONTROL0(PpapiHostMsg_Keepalive)
 
-// -----------------------------------------------------------------------------
 // These are from the plugin to the renderer.
 
 // Reply to PpapiMsg_CreateChannel. The handle will be NULL if the channel
diff --git a/ppapi/shared_impl/ppapi_constants.h b/ppapi/shared_impl/ppapi_constants.h
index c26d9a7..6fdb00e 100644
--- a/ppapi/shared_impl/ppapi_constants.h
+++ b/ppapi/shared_impl/ppapi_constants.h
@@ -10,11 +10,6 @@
 
 namespace ppapi {
 
-// Default interval to space out IPC messages sent indicating that a plugin is
-// active and should be kept alive. The value must be smaller than any threshold
-// used to kill inactive plugins by the embedder host.
-const unsigned kKeepaliveThrottleIntervalDefaultMilliseconds = 5000;
-
 #if defined(OS_WIN)
 const char kPowerSaverTestPluginName[] = "power_saver_test_plugin.dll";
 #elif defined(OS_MACOSX)
diff --git a/ppapi/shared_impl/ppapi_globals.cc b/ppapi/shared_impl/ppapi_globals.cc
index 1d6d78f..5a93ad61 100644
--- a/ppapi/shared_impl/ppapi_globals.cc
+++ b/ppapi/shared_impl/ppapi_globals.cc
@@ -66,8 +66,6 @@
 
 bool PpapiGlobals::IsPluginGlobals() const { return false; }
 
-void PpapiGlobals::MarkPluginIsActive() {}
-
 // static
 PpapiGlobals* PpapiGlobals::GetThreadLocalPointer() {
   return tls_ppapi_globals_for_test.Pointer()->Get();
diff --git a/ppapi/shared_impl/ppapi_globals.h b/ppapi/shared_impl/ppapi_globals.h
index f069ab0..3dcc901f 100644
--- a/ppapi/shared_impl/ppapi_globals.h
+++ b/ppapi/shared_impl/ppapi_globals.h
@@ -128,12 +128,6 @@
   virtual bool IsHostGlobals() const;
   virtual bool IsPluginGlobals() const;
 
-  // Records that the plugin is active. The plugin reports that it is active to
-  // containers that monitor and shutdown idle content such as background apps.
-  // This method only has an effect on the plugin process, calls from the
-  // renderer process will have no effect.
-  virtual void MarkPluginIsActive();
-
  private:
   // Return the thread-local pointer which is used only for unit testing. It
   // should always be NULL when running in production. It allows separate
diff --git a/ppapi/shared_impl/ppapi_nacl_plugin_args.cc b/ppapi/shared_impl/ppapi_nacl_plugin_args.cc
index 4dd5110..c30470b 100644
--- a/ppapi/shared_impl/ppapi_nacl_plugin_args.cc
+++ b/ppapi/shared_impl/ppapi_nacl_plugin_args.cc
@@ -10,10 +10,7 @@
 // We must provide explicit definitions of these functions for builds on
 // Windows.
 PpapiNaClPluginArgs::PpapiNaClPluginArgs()
-    : off_the_record(false),
-      supports_dev_channel(false),
-      keepalive_throttle_interval_milliseconds(
-          kKeepaliveThrottleIntervalDefaultMilliseconds) {}
+    : off_the_record(false), supports_dev_channel(false) {}
 
 PpapiNaClPluginArgs::~PpapiNaClPluginArgs() {}
 
diff --git a/ppapi/shared_impl/ppapi_nacl_plugin_args.h b/ppapi/shared_impl/ppapi_nacl_plugin_args.h
index 993131d..2f18c8e02 100644
--- a/ppapi/shared_impl/ppapi_nacl_plugin_args.h
+++ b/ppapi/shared_impl/ppapi_nacl_plugin_args.h
@@ -20,7 +20,6 @@
   bool off_the_record;
   PpapiPermissions permissions;
   bool supports_dev_channel;
-  unsigned keepalive_throttle_interval_milliseconds;
 
   // Switches from the command-line.
   std::vector<std::string> switch_names;
diff --git a/ppapi/tests/extensions/background_keepalive/background.js b/ppapi/tests/extensions/background_keepalive/background.js
index cd649c1..456374ef 100644
--- a/ppapi/tests/extensions/background_keepalive/background.js
+++ b/ppapi/tests/extensions/background_keepalive/background.js
@@ -2,40 +2,53 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-var NaClModulesExpected = 0;
-var NaClModulesLoaded = 0;
+var modulesCreated = 0;
 
 // Indicate load success.
-function moduleDidLoad() {
-  NaClModulesLoaded++;
-  if (NaClModulesLoaded == NaClModulesExpected)
-    chrome.test.sendMessage("nacl_modules_loaded", handleChromeTestMessage);
+function moduleDidLoad(moduleNumber) {
+  chrome.test.sendMessage('created_module:' + moduleNumber.toString(),
+                          handleChromeTestMessage);
 }
 
 var handleChromeTestMessage = function (message) {
-  NaClModules = document.querySelectorAll('embed');
-  for (var i = 0; i < NaClModules.length; i++) {
-    NaClModules[i].postMessage(message);
+  if (message == 'create_module') {
+    createNaClEmbed(true);
+  } else if (message == 'create_module_without_hack') {
+    createNaClEmbed(false);
+  } else if (message == 'destroy_module') {
+    destroyNaClEmbed();
   }
 }
 
-function handleNaclMessage(message_event) {
-  console.log("handleNaclMessage: " + message_event.data);
+function handleNaclMessage(messageEvent) {
+  console.log('handleNaclMessage: ' + messageEvent.data);
 }
 
-function createNaClEmbed() {
-  NaClModulesExpected++;
+function createNaClEmbed(touchEmbedHack) {
+  modulesCreated++;
 
-  var listener = document.createElement("div");
-  listener.addEventListener("load", moduleDidLoad, true);
-  listener.addEventListener("message", handleNaclMessage, true);
-  listener.innerHTML = '<embed' +
-    ' src="ppapi_tests_extensions_background_keepalive.nmf"' +
-    ' type="application/x-nacl" />';
+  var embed = document.createElement('embed');
+  embed.src = 'ppapi_tests_extensions_background_keepalive.nmf';
+  embed.type = 'application/x-nacl';
+
+  var listener = document.createElement('div');
+  listener.addEventListener('load', moduleDidLoad.bind(null, modulesCreated),
+                            true);
+  listener.addEventListener('message', handleNaclMessage, true);
+  listener.appendChild(embed);
+
   document.body.appendChild(listener);
+
+  if (touchEmbedHack)
+    console.assert(embed.lastError == 0);
 }
 
-// Create 2 embeds to verify that we can handle more than one.
-createNaClEmbed();
-createNaClEmbed();
+function destroyNaClEmbed() {
+  moduleDivs = document.querySelectorAll('div');
+  console.assert(moduleDivs.length > 0);
+  document.body.removeChild(moduleDivs[0]);
 
+  chrome.test.sendMessage('destroyed_module', handleChromeTestMessage);
+}
+
+chrome.test.sendMessage('ready', handleChromeTestMessage);
diff --git a/ppapi/thunk/enter.cc b/ppapi/thunk/enter.cc
index a98a3ec..84cfc5b 100644
--- a/ppapi/thunk/enter.cc
+++ b/ppapi/thunk/enter.cc
@@ -9,7 +9,6 @@
 #include "base/message_loop/message_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/lock.h"
-#include "ppapi/c/pp_errors.h"
 #include "ppapi/shared_impl/ppapi_globals.h"
 #include "ppapi/shared_impl/tracked_callback.h"
 #include "ppapi/thunk/ppb_instance_api.h"
@@ -35,53 +34,39 @@
 
 namespace subtle {
 
-EnterBase::EnterBase()
-    : resource_(NULL),
-      retval_(PP_OK) {
-  PpapiGlobals::Get()->MarkPluginIsActive();
-}
+EnterBase::EnterBase() {}
 
-EnterBase::EnterBase(PP_Resource resource)
-    : resource_(GetResource(resource)),
-      retval_(PP_OK) {
-  PpapiGlobals::Get()->MarkPluginIsActive();
-}
+EnterBase::EnterBase(PP_Resource resource) : resource_(GetResource(resource)) {}
 
 EnterBase::EnterBase(PP_Instance instance, SingletonResourceID resource_id)
-    : resource_(GetSingletonResource(instance, resource_id)),
-      retval_(PP_OK) {
-  PpapiGlobals::Get()->MarkPluginIsActive();
+    : resource_(GetSingletonResource(instance, resource_id)) {
+  if (!resource_)
+    retval_ = PP_ERROR_BADARGUMENT;
 }
 
 EnterBase::EnterBase(PP_Resource resource,
                      const PP_CompletionCallback& callback)
-    : resource_(GetResource(resource)),
-      retval_(PP_OK) {
+    : EnterBase(resource) {
   callback_ = new TrackedCallback(resource_, callback);
-  PpapiGlobals::Get()->MarkPluginIsActive();
 }
 
-EnterBase::EnterBase(PP_Instance instance, SingletonResourceID resource_id,
+EnterBase::EnterBase(PP_Instance instance,
+                     SingletonResourceID resource_id,
                      const PP_CompletionCallback& callback)
-    : resource_(GetSingletonResource(instance, resource_id)),
-      retval_(PP_OK) {
-  if (!resource_)
-    retval_ = PP_ERROR_BADARGUMENT;
+    : EnterBase(instance, resource_id) {
   callback_ = new TrackedCallback(resource_, callback);
-  PpapiGlobals::Get()->MarkPluginIsActive();
 }
 
 EnterBase::~EnterBase() {
   // callback_ is cleared any time it is run, scheduled to be run, or once we
   // know it will be completed asynchronously. So by this point it should be
-  // NULL.
-  DCHECK(!callback_.get())
-      << "|callback_| is not NULL. Did you forget to call "
-         "|EnterBase::SetResult| in the interface's thunk?";
+  // null.
+  DCHECK(!callback_) << "|callback_| is not null. Did you forget to call "
+                        "|EnterBase::SetResult| in the interface's thunk?";
 }
 
 int32_t EnterBase::SetResult(int32_t result) {
-  if (!callback_.get()) {
+  if (!callback_) {
     // It doesn't make sense to call SetResult if there is no callback.
     NOTREACHED();
     retval_ = result;
@@ -110,7 +95,7 @@
       retval_ = result;
     }
   }
-  callback_ = NULL;
+  callback_ = nullptr;
   return retval_;
 }
 
@@ -125,7 +110,7 @@
   PPB_Instance_API* ppb_instance =
       PpapiGlobals::Get()->GetInstanceAPI(instance);
   if (!ppb_instance)
-    return NULL;
+    return nullptr;
 
   return ppb_instance->GetSingletonResource(instance, resource_id);
 }
@@ -135,11 +120,11 @@
     // In-process plugins can't make PPAPI calls off the main thread.
     CHECK(IsMainThread());
   }
-  if (callback_.get()) {
+  if (callback_) {
     if (callback_->is_blocking() && IsMainThread()) {
       // Blocking callbacks are never allowed on the main thread.
       callback_->MarkAsCompleted();
-      callback_ = NULL;
+      callback_ = nullptr;
       retval_ = PP_ERROR_BLOCKS_MAIN_THREAD;
       if (report_error) {
         std::string message(
@@ -151,7 +136,7 @@
                CurrentThreadHandlingBlockingMessage()) {
       // Blocking callbacks are not allowed while handling a blocking message.
       callback_->MarkAsCompleted();
-      callback_ = NULL;
+      callback_ = nullptr;
       retval_ = PP_ERROR_WOULD_BLOCK_THREAD;
       if (report_error) {
         std::string message("Blocking callbacks are not allowed while handling "
@@ -179,7 +164,7 @@
       }
 
       callback_->MarkAsCompleted();
-      callback_ = NULL;
+      callback_ = nullptr;
       retval_ = PP_ERROR_NO_MESSAGE_LOOP;
       if (report_error) {
         std::string message(
@@ -192,7 +177,7 @@
 }
 
 void EnterBase::ClearCallback() {
-  callback_ = NULL;
+  callback_ = nullptr;
 }
 
 void EnterBase::SetStateForResourceError(PP_Resource pp_resource,
@@ -208,14 +193,14 @@
   if (object)
     return;  // Everything worked.
 
-  if (callback_.get() && callback_->is_required()) {
+  if (callback_ && callback_->is_required()) {
     callback_->PostRun(static_cast<int32_t>(PP_ERROR_BADRESOURCE));
-    callback_ = NULL;
+    callback_ = nullptr;
     retval_ = PP_OK_COMPLETIONPENDING;
   } else {
-    if (callback_.get())
+    if (callback_)
       callback_->MarkAsCompleted();
-    callback_ = NULL;
+    callback_ = nullptr;
     retval_ = PP_ERROR_BADRESOURCE;
   }
 
@@ -250,14 +235,14 @@
   if (object)
     return;  // Everything worked.
 
-  if (callback_.get() && callback_->is_required()) {
+  if (callback_ && callback_->is_required()) {
     callback_->PostRun(static_cast<int32_t>(PP_ERROR_BADARGUMENT));
-    callback_ = NULL;
+    callback_ = nullptr;
     retval_ = PP_OK_COMPLETIONPENDING;
   } else {
-    if (callback_.get())
+    if (callback_)
       callback_->MarkAsCompleted();
-    callback_ = NULL;
+    callback_ = nullptr;
     retval_ = PP_ERROR_BADARGUMENT;
   }
 
diff --git a/ppapi/thunk/enter.h b/ppapi/thunk/enter.h
index 307b446..041a2dd5 100644
--- a/ppapi/thunk/enter.h
+++ b/ppapi/thunk/enter.h
@@ -148,8 +148,8 @@
 
   // For Enter objects that need a resource, we'll store a pointer to the
   // Resource object so that we don't need to look it up more than once. For
-  // Enter objects with no resource, this will be NULL.
-  Resource* resource_;
+  // Enter objects with no resource, this will be null.
+  Resource* resource_ = nullptr;
 
  private:
   bool CallbackIsValid() const;
@@ -161,10 +161,10 @@
   void SetStateForCallbackError(bool report_error);
 
   // Holds the callback. For Enter objects that aren't given a callback, this
-  // will be NULL.
+  // will be null.
   scoped_refptr<TrackedCallback> callback_;
 
-  int32_t retval_;
+  int32_t retval_ = PP_OK;
 };
 
 }  // namespace subtle
@@ -195,7 +195,7 @@
     if (resource_)
       object_ = resource_->GetAs<ResourceT>();
     else
-      object_ = NULL;
+      object_ = nullptr;
     // Validate the resource (note, if both are wrong, we will return
     // PP_ERROR_BADRESOURCE; last in wins).
     SetStateForResourceError(resource, resource_, object_, report_error);
@@ -265,16 +265,13 @@
       public subtle::EnterBase {
  public:
   explicit EnterInstanceAPI(PP_Instance instance)
-      : EnterBase(instance, ApiT::kSingletonResourceID),
-        functions_(NULL) {
+      : EnterBase(instance, ApiT::kSingletonResourceID) {
     if (resource_)
       functions_ = resource_->GetAs<ApiT>();
     SetStateForFunctionError(instance, functions_, true);
   }
-  EnterInstanceAPI(PP_Instance instance,
-                   const PP_CompletionCallback& callback)
-      : EnterBase(instance, ApiT::kSingletonResourceID, callback),
-        functions_(NULL) {
+  EnterInstanceAPI(PP_Instance instance, const PP_CompletionCallback& callback)
+      : EnterBase(instance, ApiT::kSingletonResourceID, callback) {
     if (resource_)
       functions_ = resource_->GetAs<ApiT>();
     SetStateForFunctionError(instance, functions_, true);
@@ -287,7 +284,7 @@
   ApiT* functions() const { return functions_; }
 
  private:
-  ApiT* functions_;
+  ApiT* functions_ = nullptr;
 };
 
 template<typename ApiT>
diff --git a/printing/BUILD.gn b/printing/BUILD.gn
index e9f5d5cb..f051b00 100644
--- a/printing/BUILD.gn
+++ b/printing/BUILD.gn
@@ -54,6 +54,7 @@
     "pdf_metafile_cg_mac.h",
     "pdf_metafile_skia.cc",
     "pdf_metafile_skia.h",
+    "pdf_render_settings.h",
     "print_dialog_gtk_interface.h",
     "print_job_constants.cc",
     "print_job_constants.h",
@@ -74,8 +75,10 @@
     "printed_pages_source.h",
     "printing_context.cc",
     "printing_context.h",
+    "printing_export.h",
     "printing_utils.cc",
     "printing_utils.h",
+    "pwg_raster_settings.h",
     "units.cc",
     "units.h",
   ]
diff --git a/printing/pdf_render_settings.h b/printing/pdf_render_settings.h
index 545def0..48e1220 100644
--- a/printing/pdf_render_settings.h
+++ b/printing/pdf_render_settings.h
@@ -5,16 +5,9 @@
 #ifndef PRINTING_PDF_RENDER_SETTINGS_H_
 #define PRINTING_PDF_RENDER_SETTINGS_H_
 
-#include <stdint.h>
-
-#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_message_utils.h"
-#include "ipc/ipc_param_traits.h"
-#include "printing/printing_export.h"
+#include "build/build_config.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/ipc/geometry/gfx_param_traits.h"
-#include "ui/gfx/ipc/skia/gfx_skia_param_traits.h"
 
 namespace printing {
 
diff --git a/remoting/BUILD.gn b/remoting/BUILD.gn
index a630f569f..9832ff4 100644
--- a/remoting/BUILD.gn
+++ b/remoting/BUILD.gn
@@ -60,7 +60,10 @@
     }
 
     if (is_linux && !is_chromeos) {
-      deps += [ "//remoting/host/linux:remoting_dev_me2me_host" ]
+      deps += [
+        "//remoting/host/linux:remoting_dev_me2me_host",
+        "//remoting/host/linux:remoting_user_session",
+      ]
     }
   }
 
diff --git a/remoting/host/disconnect_window_chromeos.cc b/remoting/host/disconnect_window_chromeos.cc
index bb4b8ff..16efcf98 100644
--- a/remoting/host/disconnect_window_chromeos.cc
+++ b/remoting/host/disconnect_window_chromeos.cc
@@ -5,7 +5,7 @@
 #include <string>
 
 #include "ash/common/system/tray/system_tray_notifier.h"
-#include "ash/common/wm_shell.h"
+#include "ash/shell.h"
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
@@ -32,7 +32,7 @@
 DisconnectWindowAura::DisconnectWindowAura() {}
 
 DisconnectWindowAura::~DisconnectWindowAura() {
-  ash::WmShell::Get()->system_tray_notifier()->NotifyScreenShareStop();
+  ash::Shell::Get()->system_tray_notifier()->NotifyScreenShareStop();
 }
 
 void DisconnectWindowAura::Start(
@@ -40,7 +40,7 @@
   // TODO(kelvinp): Clean up the NotifyScreenShareStart interface when we
   // completely retire Hangout Remote Desktop v1.
   base::string16 helper_name;
-  ash::WmShell::Get()->system_tray_notifier()->NotifyScreenShareStart(
+  ash::Shell::Get()->system_tray_notifier()->NotifyScreenShareStart(
       base::Bind(&ClientSessionControl::DisconnectSession,
                  client_session_control, protocol::OK),
       helper_name);
diff --git a/remoting/proto/video_stats.proto b/remoting/proto/video_stats.proto
index 198edca..6bc4bb6 100644
--- a/remoting/proto/video_stats.proto
+++ b/remoting/proto/video_stats.proto
@@ -11,6 +11,7 @@
 
 package remoting;
 
+// Next Id: 13
 message FrameStatsMessage {
   // Frame ID.
   optional uint32 frame_id = 1;
@@ -44,5 +45,9 @@
 
   // Current bandwidth estimate in kb/s.
   optional int32 bandwidth_estimate_kbps = 11;
+
+  // The capturer Id to indicate the implementation of ScreenCapturer that
+  // generates this frame.
+  optional uint32 capturer_id = 12;
 }
 
diff --git a/remoting/protocol/frame_stats.cc b/remoting/protocol/frame_stats.cc
index ca9ad4b..2c73e90 100644
--- a/remoting/protocol/frame_stats.cc
+++ b/remoting/protocol/frame_stats.cc
@@ -133,6 +133,9 @@
   if (bandwidth_estimate_kbps >= 0) {
     message_out->set_bandwidth_estimate_kbps(bandwidth_estimate_kbps);
   }
+  if (capturer_id != webrtc::DesktopCapturerId::kUnknown) {
+    message_out->set_capturer_id(capturer_id);
+  }
 }
 
 FrameStats::FrameStats() = default;
diff --git a/remoting/protocol/frame_stats.h b/remoting/protocol/frame_stats.h
index 1bbdf8b..dc29126 100644
--- a/remoting/protocol/frame_stats.h
+++ b/remoting/protocol/frame_stats.h
@@ -6,6 +6,7 @@
 #define REMOTING_PROTOCOL_FRAME_STATS_H_
 
 #include "base/time/time.h"
+#include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h"
 
 namespace remoting {
 
@@ -41,6 +42,7 @@
   base::TimeDelta send_pending_delay = base::TimeDelta::Max();
   base::TimeDelta rtt_estimate = base::TimeDelta::Max();
   int bandwidth_estimate_kbps = -1;
+  uint32_t capturer_id = webrtc::DesktopCapturerId::kUnknown;
 };
 
 struct ClientFrameStats {
diff --git a/remoting/protocol/webrtc_video_stream.cc b/remoting/protocol/webrtc_video_stream.cc
index 8c2478b..79a7dce 100644
--- a/remoting/protocol/webrtc_video_stream.cc
+++ b/remoting/protocol/webrtc_video_stream.cc
@@ -26,7 +26,7 @@
 const char kStreamLabel[] = "screen_stream";
 const char kVideoLabel[] = "screen_video";
 
-struct WebrtcVideoStream::FrameTimestamps {
+struct WebrtcVideoStream::FrameStats {
   // The following fields is not null only for one frame after each incoming
   // input event.
   InputEventTimestamps input_event_timestamps;
@@ -36,11 +36,13 @@
   base::TimeDelta capture_delay;
   base::TimeTicks encode_started_time;
   base::TimeTicks encode_ended_time;
+
+  uint32_t capturer_id = 0;
 };
 
-struct WebrtcVideoStream::EncodedFrameWithTimestamps {
+struct WebrtcVideoStream::EncodedFrameWithStats {
   std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame;
-  std::unique_ptr<FrameTimestamps> timestamps;
+  std::unique_ptr<FrameStats> stats;
 };
 
 WebrtcVideoStream::WebrtcVideoStream()
@@ -139,8 +141,8 @@
     std::unique_ptr<webrtc::DesktopFrame> frame) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  captured_frame_timestamps_->capture_ended_time = base::TimeTicks::Now();
-  captured_frame_timestamps_->capture_delay =
+  captured_frame_stats_->capture_ended_time = base::TimeTicks::Now();
+  captured_frame_stats_->capture_delay =
       base::TimeDelta::FromMilliseconds(frame ? frame->capture_time_ms() : 0);
 
   WebrtcVideoEncoder::FrameParams frame_params;
@@ -166,7 +168,7 @@
       encode_task_runner_.get(), FROM_HERE,
       base::Bind(&WebrtcVideoStream::EncodeFrame, encoder_.get(),
                  base::Passed(std::move(frame)), frame_params,
-                 base::Passed(std::move(captured_frame_timestamps_))),
+                 base::Passed(std::move(captured_frame_stats_))),
       base::Bind(&WebrtcVideoStream::OnFrameEncoded,
                  weak_factory_.GetWeakPtr()));
 }
@@ -184,29 +186,32 @@
 void WebrtcVideoStream::CaptureNextFrame() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  captured_frame_timestamps_.reset(new FrameTimestamps());
-  captured_frame_timestamps_->capture_started_time = base::TimeTicks::Now();
-  captured_frame_timestamps_->input_event_timestamps =
+  captured_frame_stats_.reset(new FrameStats());
+  captured_frame_stats_->capture_started_time = base::TimeTicks::Now();
+  captured_frame_stats_->input_event_timestamps =
       event_timestamps_source_->TakeLastEventTimestamps();
 
   capturer_->CaptureFrame();
 }
 
 // static
-WebrtcVideoStream::EncodedFrameWithTimestamps WebrtcVideoStream::EncodeFrame(
+WebrtcVideoStream::EncodedFrameWithStats WebrtcVideoStream::EncodeFrame(
     WebrtcVideoEncoder* encoder,
     std::unique_ptr<webrtc::DesktopFrame> frame,
     WebrtcVideoEncoder::FrameParams params,
-    std::unique_ptr<WebrtcVideoStream::FrameTimestamps> timestamps) {
-  EncodedFrameWithTimestamps result;
-  result.timestamps = std::move(timestamps);
-  result.timestamps->encode_started_time = base::TimeTicks::Now();
+    std::unique_ptr<WebrtcVideoStream::FrameStats> stats) {
+  EncodedFrameWithStats result;
+  result.stats = std::move(stats);
+  result.stats->encode_started_time = base::TimeTicks::Now();
   result.frame = encoder->Encode(frame.get(), params);
-  result.timestamps->encode_ended_time = base::TimeTicks::Now();
+  result.stats->encode_ended_time = base::TimeTicks::Now();
+  if (frame) {
+    result.stats->capturer_id = frame->capturer_id();
+  }
   return result;
 }
 
-void WebrtcVideoStream::OnFrameEncoded(EncodedFrameWithTimestamps frame) {
+void WebrtcVideoStream::OnFrameEncoded(EncodedFrameWithStats frame) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   HostFrameStats stats;
@@ -218,7 +223,7 @@
 
   webrtc::EncodedImageCallback::Result result =
       webrtc_transport_->video_encoder_factory()->SendEncodedFrame(
-          *frame.frame, frame.timestamps->capture_started_time);
+          *frame.frame, frame.stats->capture_started_time);
   if (result.error != webrtc::EncodedImageCallback::Result::OK) {
     // TODO(sergeyu): Stop the stream.
     LOG(ERROR) << "Failed to send video frame.";
@@ -229,26 +234,28 @@
   if (video_stats_dispatcher_.is_connected()) {
     stats.frame_size = frame.frame ? frame.frame->data.size() : 0;
 
-    if (!frame.timestamps->input_event_timestamps.is_null()) {
+    if (!frame.stats->input_event_timestamps.is_null()) {
       stats.capture_pending_delay =
-          frame.timestamps->capture_started_time -
-          frame.timestamps->input_event_timestamps.host_timestamp;
+          frame.stats->capture_started_time -
+          frame.stats->input_event_timestamps.host_timestamp;
       stats.latest_event_timestamp =
-          frame.timestamps->input_event_timestamps.client_timestamp;
+          frame.stats->input_event_timestamps.client_timestamp;
     }
 
-    stats.capture_delay = frame.timestamps->capture_delay;
+    stats.capture_delay = frame.stats->capture_delay;
 
     // Total overhead time for IPC and threading when capturing frames.
-    stats.capture_overhead_delay = (frame.timestamps->capture_ended_time -
-                                    frame.timestamps->capture_started_time) -
-                                   stats.capture_delay;
+    stats.capture_overhead_delay =
+        (frame.stats->capture_ended_time - frame.stats->capture_started_time) -
+        stats.capture_delay;
 
-    stats.encode_pending_delay = frame.timestamps->encode_started_time -
-                                 frame.timestamps->capture_ended_time;
+    stats.encode_pending_delay =
+        frame.stats->encode_started_time - frame.stats->capture_ended_time;
 
-    stats.encode_delay = frame.timestamps->encode_ended_time -
-                         frame.timestamps->encode_started_time;
+    stats.encode_delay =
+        frame.stats->encode_ended_time - frame.stats->encode_started_time;
+
+    stats.capturer_id = frame.stats->capturer_id;
 
     video_stats_dispatcher_.OnVideoFrameStats(result.frame_id, stats);
   }
diff --git a/remoting/protocol/webrtc_video_stream.h b/remoting/protocol/webrtc_video_stream.h
index 6d1d1c67..376eec0 100644
--- a/remoting/protocol/webrtc_video_stream.h
+++ b/remoting/protocol/webrtc_video_stream.h
@@ -52,8 +52,8 @@
   void SetObserver(Observer* observer) override;
 
  private:
-  struct FrameTimestamps;
-  struct EncodedFrameWithTimestamps;
+  struct FrameStats;
+  struct EncodedFrameWithStats;
 
   // webrtc::DesktopCapturer::Callback interface.
   void OnCaptureResult(webrtc::DesktopCapturer::Result result,
@@ -67,12 +67,12 @@
   void CaptureNextFrame();
 
   // Task running on the encoder thread to encode the |frame|.
-  static EncodedFrameWithTimestamps EncodeFrame(
+  static EncodedFrameWithStats EncodeFrame(
       WebrtcVideoEncoder* encoder,
       std::unique_ptr<webrtc::DesktopFrame> frame,
       WebrtcVideoEncoder::FrameParams params,
-      std::unique_ptr<WebrtcVideoStream::FrameTimestamps> timestamps);
-  void OnFrameEncoded(EncodedFrameWithTimestamps frame);
+      std::unique_ptr<WebrtcVideoStream::FrameStats> stats);
+  void OnFrameEncoded(EncodedFrameWithStats frame);
 
   // Capturer used to capture the screen.
   std::unique_ptr<webrtc::DesktopCapturer> capturer_;
@@ -90,8 +90,8 @@
 
   HostVideoStatsDispatcher video_stats_dispatcher_;
 
-  // Timestamps for the frame that's being captured.
-  std::unique_ptr<FrameTimestamps> captured_frame_timestamps_;
+  // Stats of the frame that's being captured.
+  std::unique_ptr<FrameStats> captured_frame_stats_;
 
   std::unique_ptr<WebrtcFrameScheduler> scheduler_;
 
diff --git a/services/BUILD.gn b/services/BUILD.gn
index 4b81d47d..7ac2551 100644
--- a/services/BUILD.gn
+++ b/services/BUILD.gn
@@ -15,8 +15,8 @@
 # entries in the "service_unittests_catalog" target below.
 service_test("service_unittests") {
   deps = [
+    "//services/data_decoder:tests",
     "//services/device:tests",
-    "//services/image_decoder:tests",
     "//services/preferences:tests",
     "//services/resource_coordinator:tests",
     "//services/shape_detection:tests",
diff --git a/services/image_decoder/BUILD.gn b/services/data_decoder/BUILD.gn
similarity index 84%
rename from services/image_decoder/BUILD.gn
rename to services/data_decoder/BUILD.gn
index fac256d..6f347b95 100644
--- a/services/image_decoder/BUILD.gn
+++ b/services/data_decoder/BUILD.gn
@@ -7,23 +7,23 @@
 
 source_set("lib") {
   sources = [
+    "data_decoder_service.cc",
+    "data_decoder_service.h",
     "image_decoder_impl.cc",
     "image_decoder_impl.h",
-    "image_decoder_service.cc",
-    "image_decoder_service.h",
   ]
 
   deps = [
     "//base",
-    "//content/public/child",
     "//mojo/public/cpp/bindings",
     "//skia",
+    "//third_party/WebKit/public:blink",
     "//ui/gfx",
     "//ui/gfx/geometry",
   ]
 
   public_deps = [
-    "//services/image_decoder/public/interfaces",
+    "//services/data_decoder/public/interfaces",
     "//services/service_manager/public/cpp",
   ]
 }
@@ -50,6 +50,6 @@
 }
 
 service_manifest("manifest") {
-  name = "image_decoder"
+  name = "data_decoder"
   source = "manifest.json"
 }
diff --git a/services/image_decoder/DEPS b/services/data_decoder/DEPS
similarity index 80%
rename from services/image_decoder/DEPS
rename to services/data_decoder/DEPS
index 9dca8ee..d15dcafe 100644
--- a/services/image_decoder/DEPS
+++ b/services/data_decoder/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+content/public/child",
   "+gin",
   "+skia",
   "+third_party/WebKit/public",
diff --git a/services/data_decoder/README.md b/services/data_decoder/README.md
new file mode 100644
index 0000000..e84b2a13
--- /dev/null
+++ b/services/data_decoder/README.md
@@ -0,0 +1,3 @@
+The data_decoder service exists to facilitate safe data decoding within an
+isolated sandboxed process.
+
diff --git a/services/image_decoder/image_decoder_service.cc b/services/data_decoder/data_decoder_service.cc
similarity index 68%
rename from services/image_decoder/image_decoder_service.cc
rename to services/data_decoder/data_decoder_service.cc
index 4ad2a0b..17c9e424 100644
--- a/services/image_decoder/image_decoder_service.cc
+++ b/services/data_decoder/data_decoder_service.cc
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "services/image_decoder/image_decoder_service.h"
+#include "services/data_decoder/data_decoder_service.h"
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
-#include "services/image_decoder/image_decoder_impl.h"
-#include "services/image_decoder/public/interfaces/image_decoder.mojom.h"
+#include "services/data_decoder/image_decoder_impl.h"
+#include "services/data_decoder/public/interfaces/image_decoder.mojom.h"
 #include "services/service_manager/public/cpp/interface_registry.h"
 #include "services/service_manager/public/cpp/service_context.h"
 
-namespace image_decoder {
+namespace data_decoder {
 
 namespace {
 
@@ -33,22 +33,21 @@
 
 }  // namespace
 
-ImageDecoderService::ImageDecoderService() : weak_factory_(this) {}
+DataDecoderService::DataDecoderService() : weak_factory_(this) {}
 
-ImageDecoderService::~ImageDecoderService() = default;
+DataDecoderService::~DataDecoderService() = default;
 
 // static
-std::unique_ptr<service_manager::Service> ImageDecoderService::Create() {
-  return base::MakeUnique<ImageDecoderService>();
+std::unique_ptr<service_manager::Service> DataDecoderService::Create() {
+  return base::MakeUnique<DataDecoderService>();
 }
 
-void ImageDecoderService::OnStart() {
-  ref_factory_.reset(new service_manager::ServiceContextRefFactory(
-      base::Bind(&ImageDecoderService::MaybeRequestQuitDelayed,
-                 base::Unretained(this))));
+void DataDecoderService::OnStart() {
+  ref_factory_.reset(new service_manager::ServiceContextRefFactory(base::Bind(
+      &DataDecoderService::MaybeRequestQuitDelayed, base::Unretained(this))));
 }
 
-bool ImageDecoderService::OnConnect(
+bool DataDecoderService::OnConnect(
     const service_manager::ServiceInfo& remote_info,
     service_manager::InterfaceRegistry* registry) {
   // Add a reference to the service and tie it to the lifetime of the
@@ -62,18 +61,18 @@
   return true;
 }
 
-void ImageDecoderService::MaybeRequestQuitDelayed() {
+void DataDecoderService::MaybeRequestQuitDelayed() {
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
-      base::Bind(&ImageDecoderService::MaybeRequestQuit,
+      base::Bind(&DataDecoderService::MaybeRequestQuit,
                  weak_factory_.GetWeakPtr()),
       base::TimeDelta::FromSeconds(5));
 }
 
-void ImageDecoderService::MaybeRequestQuit() {
+void DataDecoderService::MaybeRequestQuit() {
   DCHECK(ref_factory_);
   if (ref_factory_->HasNoRefs())
     context()->RequestQuit();
 }
 
-}  // namespace image_decoder
+}  // namespace data_decoder
diff --git a/services/image_decoder/image_decoder_service.h b/services/data_decoder/data_decoder_service.h
similarity index 65%
rename from services/image_decoder/image_decoder_service.h
rename to services/data_decoder/data_decoder_service.h
index a41006e..b1c0b516 100644
--- a/services/image_decoder/image_decoder_service.h
+++ b/services/data_decoder/data_decoder_service.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef SERVICES_IMAGE_DECODER_IMAGE_DECODER_SERVICE_H_
-#define SERVICES_IMAGE_DECODER_IMAGE_DECODER_SERVICE_H_
+#ifndef SERVICES_DATA_DECODER_DATA_DECODER_SERVICE_H_
+#define SERVICES_DATA_DECODER_DATA_DECODER_SERVICE_H_
 
 #include <memory>
 
@@ -13,12 +13,12 @@
 #include "services/service_manager/public/cpp/service.h"
 #include "services/service_manager/public/cpp/service_context_ref.h"
 
-namespace image_decoder {
+namespace data_decoder {
 
-class ImageDecoderService : public service_manager::Service {
+class DataDecoderService : public service_manager::Service {
  public:
-  ImageDecoderService();
-  ~ImageDecoderService() override;
+  DataDecoderService();
+  ~DataDecoderService() override;
 
   // Factory function for use as an embedded service.
   static std::unique_ptr<service_manager::Service> Create();
@@ -33,11 +33,11 @@
   void MaybeRequestQuit();
 
   std::unique_ptr<service_manager::ServiceContextRefFactory> ref_factory_;
-  base::WeakPtrFactory<ImageDecoderService> weak_factory_;
+  base::WeakPtrFactory<DataDecoderService> weak_factory_;
 
-  DISALLOW_COPY_AND_ASSIGN(ImageDecoderService);
+  DISALLOW_COPY_AND_ASSIGN(DataDecoderService);
 };
 
-}  // namespace image_decoder
+}  // namespace data_decoder
 
-#endif  // SERVICES_IMAGE_DECODER_IMAGE_DECODER_SERVICE_H_
+#endif  // SERVICES_DATA_DECODER_DATA_DECODER_SERVICE_H_
diff --git a/services/image_decoder/image_decoder_impl.cc b/services/data_decoder/image_decoder_impl.cc
similarity index 82%
rename from services/image_decoder/image_decoder_impl.cc
rename to services/data_decoder/image_decoder_impl.cc
index 53aa56a..f7a75642 100644
--- a/services/image_decoder/image_decoder_impl.cc
+++ b/services/data_decoder/image_decoder_impl.cc
@@ -2,16 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "services/image_decoder/image_decoder_impl.h"
+#include "services/data_decoder/image_decoder_impl.h"
 
 #include <string.h>
 
 #include <utility>
 
 #include "base/logging.h"
-#include "content/public/child/image_decoder_utils.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "skia/ext/image_operations.h"
+#include "third_party/WebKit/public/platform/WebData.h"
+#include "third_party/WebKit/public/platform/WebImage.h"
+#include "third_party/WebKit/public/platform/WebSize.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 
 #if defined(OS_CHROMEOS)
@@ -19,7 +21,7 @@
 #include "ui/gfx/codec/png_codec.h"
 #endif
 
-namespace image_decoder {
+namespace data_decoder {
 
 namespace {
 
@@ -58,16 +60,20 @@
     // Our robust PNG decoding is using libpng.
     if (encoded_data.size()) {
       SkBitmap decoded_png;
-      if (gfx::PNGCodec::Decode(
-            encoded_data.data(), encoded_data.size(), &decoded_png)) {
+      if (gfx::PNGCodec::Decode(encoded_data.data(), encoded_data.size(),
+                                &decoded_png)) {
         decoded_image = decoded_png;
       }
     }
   }
 #endif  // defined(OS_CHROMEOS)
   if (codec == mojom::ImageCodec::DEFAULT) {
-    decoded_image = content::DecodeImage(
-        encoded_data.data(), desired_image_frame_size, encoded_data.size());
+    decoded_image =
+        blink::WebImage::fromData(
+            blink::WebData(reinterpret_cast<const char*>(encoded_data.data()),
+                           encoded_data.size()),
+            desired_image_frame_size)
+            .getSkBitmap();
   }
 
   if (!decoded_image.isNull()) {
@@ -100,4 +106,4 @@
   callback.Run(decoded_image);
 }
 
-}  // namespace image_decoder
+}  // namespace data_decoder
diff --git a/services/image_decoder/image_decoder_impl.h b/services/data_decoder/image_decoder_impl.h
similarity index 77%
rename from services/image_decoder/image_decoder_impl.h
rename to services/data_decoder/image_decoder_impl.h
index 09dbc99..b669b254 100644
--- a/services/image_decoder/image_decoder_impl.h
+++ b/services/data_decoder/image_decoder_impl.h
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_UTILITY_IMAGE_DECODER_IMPL_H_
-#define CHROME_UTILITY_IMAGE_DECODER_IMPL_H_
+#ifndef SERVICES_DATA_DECODER_IMAGE_DECODER_IMPL_H_
+#define SERVICES_DATA_DECODER_IMAGE_DECODER_IMPL_H_
 
 #include <stdint.h>
 
 #include "base/macros.h"
-#include "services/image_decoder/public/interfaces/image_decoder.mojom.h"
+#include "services/data_decoder/public/interfaces/image_decoder.mojom.h"
 #include "services/service_manager/public/cpp/service_context_ref.h"
 #include "ui/gfx/geometry/size.h"
 
-namespace image_decoder {
+namespace data_decoder {
 
 class ImageDecoderImpl : public mojom::ImageDecoder {
  public:
@@ -34,6 +34,6 @@
   DISALLOW_COPY_AND_ASSIGN(ImageDecoderImpl);
 };
 
-}  // namespace image_decoder
+}  // namespace data_decoder
 
-#endif  // CHROME_UTILITY_IMAGE_DECODER_IMPL_H_
+#endif  // SERVICES_DATA_DECODER_IMAGE_DECODER_IMPL_H_
diff --git a/services/image_decoder/image_decoder_impl_unittest.cc b/services/data_decoder/image_decoder_impl_unittest.cc
similarity index 95%
rename from services/image_decoder/image_decoder_impl_unittest.cc
rename to services/data_decoder/image_decoder_impl_unittest.cc
index f75e8ec2..52d725b 100644
--- a/services/image_decoder/image_decoder_impl_unittest.cc
+++ b/services/data_decoder/image_decoder_impl_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/message_loop/message_loop.h"
 #include "gin/array_buffer.h"
 #include "gin/public/isolate_holder.h"
-#include "services/image_decoder/image_decoder_impl.h"
+#include "services/data_decoder/image_decoder_impl.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/platform/scheduler/utility/webthread_impl_for_utility_thread.h"
 #include "third_party/WebKit/public/web/WebKit.h"
@@ -21,7 +21,7 @@
 #include "gin/v8_initializer.h"
 #endif
 
-namespace image_decoder {
+namespace data_decoder {
 
 namespace {
 
@@ -118,8 +118,7 @@
   int base_msg_size = sizeof(skia::mojom::Bitmap::Data_);
 
   // Sizes which should trigger dimension-halving 0, 1 and 2 times
-  int heights[] = {max_height_for_msg - 10,
-                   max_height_for_msg + 10,
+  int heights[] = {max_height_for_msg - 10, max_height_for_msg + 10,
                    2 * max_height_for_msg + 10};
   int widths[] = {heights[0] * 3 / 2, heights[1] * 3 / 2, heights[2] * 3 / 2};
   for (size_t i = 0; i < arraysize(heights); i++) {
@@ -161,4 +160,4 @@
   EXPECT_TRUE(request.bitmap().isNull());
 }
 
-}  // namespace image_decoder
+}  // namespace data_decoder
diff --git a/services/data_decoder/manifest.json b/services/data_decoder/manifest.json
new file mode 100644
index 0000000..bc0335b
--- /dev/null
+++ b/services/data_decoder/manifest.json
@@ -0,0 +1,14 @@
+{
+  "name": "data_decoder",
+  "display_name": "Data Decoder Service",
+  "interface_provider_specs": {
+    "service_manager:connector": {
+      "provides": {
+        "image_decoder": [ "data_decoder::mojom::ImageDecoder" ]
+      },
+      "requires": {
+        "service_manager": [ "service_manager:all_users" ]
+      }
+    }
+  }
+}
diff --git a/services/image_decoder/public/cpp/BUILD.gn b/services/data_decoder/public/cpp/BUILD.gn
similarity index 77%
rename from services/image_decoder/public/cpp/BUILD.gn
rename to services/data_decoder/public/cpp/BUILD.gn
index b9b2a7c..ebab3dc 100644
--- a/services/image_decoder/public/cpp/BUILD.gn
+++ b/services/data_decoder/public/cpp/BUILD.gn
@@ -6,12 +6,12 @@
 
 source_set("cpp") {
   sources = [
-    "decode.cc",
-    "decode.h",
+    "decode_image.cc",
+    "decode_image.h",
   ]
 
   public_deps = [
-    "//services/image_decoder/public/interfaces",
+    "//services/data_decoder/public/interfaces",
     "//services/service_manager/public/cpp",
   ]
 }
diff --git a/services/image_decoder/public/cpp/decode.cc b/services/data_decoder/public/cpp/decode_image.cc
similarity index 70%
rename from services/image_decoder/public/cpp/decode.cc
rename to services/data_decoder/public/cpp/decode_image.cc
index 99109266..3efd460b 100644
--- a/services/image_decoder/public/cpp/decode.cc
+++ b/services/data_decoder/public/cpp/decode_image.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "services/image_decoder/public/cpp/decode.h"
+#include "services/data_decoder/public/cpp/decode_image.h"
 
-#include "services/image_decoder/public/interfaces/constants.mojom.h"
+#include "services/data_decoder/public/interfaces/constants.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 
-namespace image_decoder {
+namespace data_decoder {
 
 namespace {
 
@@ -30,13 +30,13 @@
 
 }  // namespace
 
-void Decode(service_manager::Connector* connector,
-            const std::vector<uint8_t>& encoded_bytes,
-            mojom::ImageCodec codec,
-            bool shrink_to_fit,
-            uint64_t max_size_in_bytes,
-            const gfx::Size& desired_image_frame_size,
-            const mojom::ImageDecoder::DecodeImageCallback& callback) {
+void DecodeImage(service_manager::Connector* connector,
+                 const std::vector<uint8_t>& encoded_bytes,
+                 mojom::ImageCodec codec,
+                 bool shrink_to_fit,
+                 uint64_t max_size_in_bytes,
+                 const gfx::Size& desired_image_frame_size,
+                 const mojom::ImageDecoder::DecodeImageCallback& callback) {
   mojom::ImageDecoderPtr decoder;
   connector->BindInterface(mojom::kServiceName, &decoder);
   decoder.set_connection_error_handler(
@@ -48,4 +48,4 @@
       base::Bind(&OnDecodeImage, base::Passed(&decoder), callback));
 }
 
-}  // namespace image_decoder
+}  // namespace data_decoder
diff --git a/services/data_decoder/public/cpp/decode_image.h b/services/data_decoder/public/cpp/decode_image.h
new file mode 100644
index 0000000..2517fdc
--- /dev/null
+++ b/services/data_decoder/public/cpp/decode_image.h
@@ -0,0 +1,45 @@
+// 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 SERVICES_DATA_DECODER_PUBLIC_CPP_DECODE_H_
+#define SERVICES_DATA_DECODER_PUBLIC_CPP_DECODE_H_
+
+#include <stdint.h>
+
+#include <vector>
+
+#include "services/data_decoder/public/interfaces/image_decoder.mojom.h"
+
+namespace gfx {
+class Size;
+}
+
+namespace service_manager {
+class Connector;
+}
+
+namespace data_decoder {
+
+const uint64_t kDefaultMaxSizeInBytes = 128 * 1024 * 1024;
+
+// Helper function to decode an image via the data_decoder service. For images
+// with multiple frames (e.g. ico files), a frame with a size as close as
+// possible to |desired_image_frame_size| is chosen (tries to take one in larger
+// size if there's no precise match). Passing gfx::Size() as
+// |desired_image_frame_size| is also supported and will result in chosing the
+// smallest available size.
+// Upon completion, |callback| is invoked on the calling thread TaskRunner with
+// an SkBitmap argument. The SkBitmap will be null on failure and non-null on
+// success.
+void DecodeImage(service_manager::Connector* connector,
+                 const std::vector<uint8_t>& encoded_bytes,
+                 mojom::ImageCodec codec,
+                 bool shrink_to_fit,
+                 uint64_t max_size_in_bytes,
+                 const gfx::Size& desired_image_frame_size,
+                 const mojom::ImageDecoder::DecodeImageCallback& callback);
+
+}  // namespace data_decoder
+
+#endif  // SERVICES_DATA_DECODER_PUBLIC_CPP_DECODE_H_
diff --git a/services/image_decoder/public/interfaces/BUILD.gn b/services/data_decoder/public/interfaces/BUILD.gn
similarity index 100%
rename from services/image_decoder/public/interfaces/BUILD.gn
rename to services/data_decoder/public/interfaces/BUILD.gn
diff --git a/services/image_decoder/public/interfaces/OWNERS b/services/data_decoder/public/interfaces/OWNERS
similarity index 100%
rename from services/image_decoder/public/interfaces/OWNERS
rename to services/data_decoder/public/interfaces/OWNERS
diff --git a/services/image_decoder/public/interfaces/constants.mojom b/services/data_decoder/public/interfaces/constants.mojom
similarity index 69%
rename from services/image_decoder/public/interfaces/constants.mojom
rename to services/data_decoder/public/interfaces/constants.mojom
index 5897a7d..60a96f2 100644
--- a/services/image_decoder/public/interfaces/constants.mojom
+++ b/services/data_decoder/public/interfaces/constants.mojom
@@ -2,6 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-module image_decoder.mojom;
+module data_decoder.mojom;
 
-const string kServiceName = "image_decoder";
+const string kServiceName = "data_decoder";
diff --git a/services/image_decoder/public/interfaces/image_decoder.mojom b/services/data_decoder/public/interfaces/image_decoder.mojom
similarity index 97%
rename from services/image_decoder/public/interfaces/image_decoder.mojom
rename to services/data_decoder/public/interfaces/image_decoder.mojom
index c13e796c..f53dd5f 100644
--- a/services/image_decoder/public/interfaces/image_decoder.mojom
+++ b/services/data_decoder/public/interfaces/image_decoder.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-module image_decoder.mojom;
+module data_decoder.mojom;
 
 import "skia/public/interfaces/bitmap.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
diff --git a/services/image_decoder/README.md b/services/image_decoder/README.md
deleted file mode 100644
index 8b983626..0000000
--- a/services/image_decoder/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-The image_decoder service exists to facilitate safe image decoding within an
-isolated sandboxed process.
-
diff --git a/services/image_decoder/manifest.json b/services/image_decoder/manifest.json
deleted file mode 100644
index a9fdb07..0000000
--- a/services/image_decoder/manifest.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "name": "image_decoder",
-  "display_name": "Image Decoder Service",
-  "interface_provider_specs": {
-    "service_manager:connector": {
-      "provides": {
-        "decode": [ "image_decoder::mojom::ImageDecoder" ]
-      },
-      "requires": {
-        "service_manager": [ "service_manager:all_users" ]
-      }
-    }
-  }
-}
diff --git a/services/image_decoder/public/cpp/decode.h b/services/image_decoder/public/cpp/decode.h
deleted file mode 100644
index ea0fa2e..0000000
--- a/services/image_decoder/public/cpp/decode.h
+++ /dev/null
@@ -1,45 +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 SERVICES_IMAGE_DECODER_PUBLIC_CPP_DECODE_H_
-#define SERVICES_IMAGE_DECODER_PUBLIC_CPP_DECODE_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "services/image_decoder/public/interfaces/image_decoder.mojom.h"
-
-namespace gfx {
-class Size;
-}
-
-namespace service_manager {
-class Connector;
-}
-
-namespace image_decoder {
-
-const uint64_t kDefaultMaxSizeInBytes = 128 * 1024 * 1024;
-
-// Helper function to decode an image via the image_decoder service. For images
-// with multiple frames (e.g. ico files), a frame with a size as close as
-// possible to |desired_image_frame_size| is chosen (tries to take one in larger
-// size if there's no precise match). Passing gfx::Size() as
-// |desired_image_frame_size| is also supported and will result in chosing the
-// smallest available size.
-// Upon completion, |callback| is invoked on the calling thread TaskRunner with
-// an SkBitmap argument. The SkBitmap will be null on failure and non-null on
-// success.
-void Decode(service_manager::Connector* connector,
-            const std::vector<uint8_t>& encoded_bytes,
-            mojom::ImageCodec codec,
-            bool shrink_to_fit,
-            uint64_t max_size_in_bytes,
-            const gfx::Size& desired_image_frame_size,
-            const mojom::ImageDecoder::DecodeImageCallback& callback);
-
-}  // namespace image_decoder
-
-#endif  // SERVICES_IMAGE_DECODER_PUBLIC_CPP_DECODE_H_
diff --git a/services/preferences/manifest.json b/services/preferences/manifest.json
index 1bdd7894..8b13c41 100644
--- a/services/preferences/manifest.json
+++ b/services/preferences/manifest.json
@@ -6,8 +6,7 @@
       "provides": {
         "pref_client": [
           "prefs::mojom::PrefStoreConnector",
-          "prefs::mojom::PrefStoreRegistry",
-          "prefs::mojom::PersistentPrefStoreConnector"
+          "prefs::mojom::PrefStoreRegistry"
         ],
         "pref_control": [
           "prefs::mojom::PrefServiceControl"
diff --git a/services/preferences/persistent_pref_store_factory.cc b/services/preferences/persistent_pref_store_factory.cc
index c9909fbb..ef63057 100644
--- a/services/preferences/persistent_pref_store_factory.cc
+++ b/services/preferences/persistent_pref_store_factory.cc
@@ -16,23 +16,26 @@
 
 std::unique_ptr<PersistentPrefStoreImpl> CreateSimplePersistentPrefStore(
     mojom::SimplePersistentPrefStoreConfigurationPtr config,
-    base::SequencedWorkerPool* worker_pool) {
+    base::SequencedWorkerPool* worker_pool,
+    base::Closure on_initialized) {
   return base::MakeUnique<PersistentPrefStoreImpl>(
       new JsonPrefStore(config->pref_filename,
                         JsonPrefStore::GetTaskRunnerForFile(
                             config->pref_filename.DirName(), worker_pool),
                         nullptr),
-      nullptr);
+      nullptr, std::move(on_initialized));
 }
 
 }  // namespace
 
 std::unique_ptr<PersistentPrefStoreImpl> CreatePersistentPrefStore(
     mojom::PersistentPrefStoreConfigurationPtr configuration,
-    base::SequencedWorkerPool* worker_pool) {
+    base::SequencedWorkerPool* worker_pool,
+    base::Closure on_initialized) {
   if (configuration->is_simple_configuration()) {
     return CreateSimplePersistentPrefStore(
-        std::move(configuration->get_simple_configuration()), worker_pool);
+        std::move(configuration->get_simple_configuration()), worker_pool,
+        std::move(on_initialized));
   }
   NOTREACHED();
   return nullptr;
diff --git a/services/preferences/persistent_pref_store_factory.h b/services/preferences/persistent_pref_store_factory.h
index 7fdcaf47..06cf8f7 100644
--- a/services/preferences/persistent_pref_store_factory.h
+++ b/services/preferences/persistent_pref_store_factory.h
@@ -20,7 +20,8 @@
 // configured by |configuration|.
 std::unique_ptr<PersistentPrefStoreImpl> CreatePersistentPrefStore(
     mojom::PersistentPrefStoreConfigurationPtr configuration,
-    base::SequencedWorkerPool* worker_pool);
+    base::SequencedWorkerPool* worker_pool,
+    base::Closure on_initialized);
 
 }  // namespace prefs
 
diff --git a/services/preferences/persistent_pref_store_impl.cc b/services/preferences/persistent_pref_store_impl.cc
index 65e2444a..d09e654 100644
--- a/services/preferences/persistent_pref_store_impl.cc
+++ b/services/preferences/persistent_pref_store_impl.cc
@@ -70,11 +70,13 @@
 
 PersistentPrefStoreImpl::PersistentPrefStoreImpl(
     scoped_refptr<PersistentPrefStore> backing_pref_store,
-    mojom::TrackedPreferenceValidationDelegatePtr validation_delegate)
+    mojom::TrackedPreferenceValidationDelegatePtr validation_delegate,
+    base::OnceClosure on_initialized)
     : backing_pref_store_(backing_pref_store),
       validation_delegate_(std::move(validation_delegate)) {
   backing_pref_store_->AddObserver(this);
   if (!backing_pref_store_->IsInitializationComplete()) {
+    on_initialized_ = std::move(on_initialized);
     initializing_ = true;
     backing_pref_store_->ReadPrefsAsync(nullptr);
   }
@@ -84,13 +86,28 @@
   backing_pref_store_->RemoveObserver(this);
 }
 
-// mojom::PersistentPrefStoreConnector override:
-void PersistentPrefStoreImpl::Connect(const ConnectCallback& callback) {
-  if (initializing_) {
-    pending_connect_callbacks_.push_back(callback);
-    return;
+mojom::PersistentPrefStoreConnectionPtr
+PersistentPrefStoreImpl::CreateConnection() {
+  DCHECK(!initializing_);
+  if (!backing_pref_store_->IsInitializationComplete()) {
+    // |backing_pref_store_| initialization failed.
+    return mojom::PersistentPrefStoreConnection::New(
+        nullptr, nullptr, backing_pref_store_->GetReadError(),
+        backing_pref_store_->ReadOnly());
   }
-  CallConnectCallback(callback);
+  mojom::PersistentPrefStorePtr pref_store_ptr;
+  mojom::PrefStoreObserverPtr observer;
+  mojom::PrefStoreObserverRequest observer_request =
+      mojo::MakeRequest(&observer);
+  auto connection = base::MakeUnique<Connection>(
+      this, mojo::MakeRequest(&pref_store_ptr), std::move(observer));
+  auto* connection_ptr = connection.get();
+  connections_.insert(std::make_pair(connection_ptr, std::move(connection)));
+  return mojom::PersistentPrefStoreConnection::New(
+      mojom::PrefStoreConnection::New(std::move(observer_request),
+                                      backing_pref_store_->GetValues(), true),
+      std::move(pref_store_ptr), backing_pref_store_->GetReadError(),
+      backing_pref_store_->ReadOnly());
 }
 
 void PersistentPrefStoreImpl::OnPrefValueChanged(const std::string& key) {
@@ -109,32 +126,7 @@
 void PersistentPrefStoreImpl::OnInitializationCompleted(bool succeeded) {
   DCHECK(initializing_);
   initializing_ = false;
-  for (const auto& callback : pending_connect_callbacks_) {
-    CallConnectCallback(callback);
-  }
-  pending_connect_callbacks_.clear();
-}
-
-void PersistentPrefStoreImpl::CallConnectCallback(
-    const mojom::PersistentPrefStoreConnector::ConnectCallback& callback) {
-  DCHECK(!initializing_);
-  if (!backing_pref_store_->IsInitializationComplete()) {
-    callback.Run(backing_pref_store_->GetReadError(),
-                 backing_pref_store_->ReadOnly(), nullptr, nullptr, nullptr);
-    return;
-  }
-  mojom::PersistentPrefStorePtr pref_store_ptr;
-  mojom::PrefStoreObserverPtr observer;
-  mojom::PrefStoreObserverRequest observer_request =
-      mojo::MakeRequest(&observer);
-  auto connection = base::MakeUnique<Connection>(
-      this, mojo::MakeRequest(&pref_store_ptr), std::move(observer));
-  auto* connection_ptr = connection.get();
-  connections_.insert(std::make_pair(connection_ptr, std::move(connection)));
-  callback.Run(backing_pref_store_->GetReadError(),
-               backing_pref_store_->ReadOnly(),
-               backing_pref_store_->GetValues(), std::move(pref_store_ptr),
-               std::move(observer_request));
+  std::move(on_initialized_).Run();
 }
 
 void PersistentPrefStoreImpl::SetValue(const std::string& key,
diff --git a/services/preferences/persistent_pref_store_impl.h b/services/preferences/persistent_pref_store_impl.h
index 9b7aeff..b57e67be 100644
--- a/services/preferences/persistent_pref_store_impl.h
+++ b/services/preferences/persistent_pref_store_impl.h
@@ -20,17 +20,20 @@
 
 namespace prefs {
 
-class PersistentPrefStoreImpl : public mojom::PersistentPrefStoreConnector,
-                                public PrefStore::Observer {
+class PersistentPrefStoreImpl : public PrefStore::Observer {
  public:
+  // If |initialized()| is false after construction, |on_initialized| will be
+  // called when it becomes true.
   PersistentPrefStoreImpl(
       scoped_refptr<PersistentPrefStore> backing_pref_store,
-      mojom::TrackedPreferenceValidationDelegatePtr validation_delegate);
+      mojom::TrackedPreferenceValidationDelegatePtr validation_delegate,
+      base::OnceClosure on_initialized);
 
   ~PersistentPrefStoreImpl() override;
 
-  // mojom::PersistentPrefStoreConnector override:
-  void Connect(const ConnectCallback& callback) override;
+  mojom::PersistentPrefStoreConnectionPtr CreateConnection();
+
+  bool initialized() { return !initializing_; }
 
  private:
   class Connection;
@@ -47,18 +50,17 @@
   void OnPrefValueChanged(const std::string& key) override;
   void OnInitializationCompleted(bool succeeded) override;
 
-  void CallConnectCallback(
-      const mojom::PersistentPrefStoreConnector::ConnectCallback& callback);
   void OnConnectionError(Connection* connection);
 
   scoped_refptr<PersistentPrefStore> backing_pref_store_;
   mojom::TrackedPreferenceValidationDelegatePtr validation_delegate_;
 
   bool initializing_ = false;
-  std::vector<ConnectCallback> pending_connect_callbacks_;
 
   std::unordered_map<Connection*, std::unique_ptr<Connection>> connections_;
 
+  base::OnceClosure on_initialized_;
+
   DISALLOW_COPY_AND_ASSIGN(PersistentPrefStoreImpl);
 };
 
diff --git a/services/preferences/persistent_pref_store_impl_unittest.cc b/services/preferences/persistent_pref_store_impl_unittest.cc
index 806a342..e4267ce 100644
--- a/services/preferences/persistent_pref_store_impl_unittest.cc
+++ b/services/preferences/persistent_pref_store_impl_unittest.cc
@@ -40,14 +40,17 @@
   ~PersistentPrefStoreMock() override = default;
 };
 
-class PrefStoreConnectorMock : public mojom::PrefStoreConnector {
- public:
-  MOCK_METHOD1(Connect, void(const ConnectCallback&));
-};
-
 class InitializationMockPersistentPrefStore : public InMemoryPrefStore {
  public:
-  bool IsInitializationComplete() const override { return initialized_; }
+  InitializationMockPersistentPrefStore(
+      bool success,
+      PersistentPrefStore::PrefReadError error,
+      bool read_only)
+      : success_(success), read_error_(error), read_only_(read_only) {}
+
+  bool IsInitializationComplete() const override {
+    return initialized_ && success_;
+  }
 
   void AddObserver(PrefStore::Observer* observer) override {
     observers_.AddObserver(observer);
@@ -59,6 +62,17 @@
 
   void ReadPrefsAsync(ReadErrorDelegate* error_delegate) override {
     DCHECK(!error_delegate);
+    DCHECK(!initialized_);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::Bind(&InitializationMockPersistentPrefStore::CompleteRead, this));
+  }
+
+  void CompleteRead() {
+    initialized_ = true;
+    for (auto& observer : observers_) {
+      observer.OnInitializationCompleted(success_);
+    }
   }
 
   PersistentPrefStore::PrefReadError GetReadError() const override {
@@ -66,26 +80,18 @@
   }
   bool ReadOnly() const override { return read_only_; }
 
-  void Initialize(bool success,
-                  PersistentPrefStore::PrefReadError error,
-                  bool read_only) {
-    initialized_ = success;
-    read_error_ = error;
-    read_only_ = read_only;
-    for (auto& observer : observers_) {
-      observer.OnInitializationCompleted(initialized_);
-    }
-  }
-
  private:
   ~InitializationMockPersistentPrefStore() override = default;
 
-  PersistentPrefStore::PrefReadError read_error_;
-  bool read_only_ = false;
   bool initialized_ = false;
+  bool success_;
+  PersistentPrefStore::PrefReadError read_error_;
+  bool read_only_;
   base::ObserverList<PrefStore::Observer, true> observers_;
 };
 
+constexpr char kKey[] = "path.to.key";
+
 class PersistentPrefStoreImplTest : public testing::Test {
  public:
   PersistentPrefStoreImplTest() = default;
@@ -94,26 +100,23 @@
   void TearDown() override {
     pref_store_ = nullptr;
     base::RunLoop().RunUntilIdle();
-    bindings_.CloseAllBindings();
-    backing_pref_store_.reset();
+    impl_.reset();
     base::RunLoop().RunUntilIdle();
   }
 
   void CreateImpl(scoped_refptr<PersistentPrefStore> backing_pref_store) {
-    backing_pref_store_ = base::MakeUnique<PersistentPrefStoreImpl>(
-        std::move(backing_pref_store), nullptr);
-    mojo::Binding<mojom::PersistentPrefStoreConnector> binding(
-        backing_pref_store_.get());
+    base::RunLoop run_loop;
+    bool initialized = backing_pref_store->IsInitializationComplete();
+    impl_ = base::MakeUnique<PersistentPrefStoreImpl>(
+        std::move(backing_pref_store), nullptr, run_loop.QuitClosure());
+    if (!initialized)
+      run_loop.Run();
     pref_store_ = CreateConnection();
   }
 
-  mojom::PersistentPrefStoreConnectorPtr CreateConnector() {
-    return bindings_.CreateInterfacePtrAndBind(backing_pref_store_.get());
-  }
-
   scoped_refptr<PersistentPrefStore> CreateConnection() {
-    return make_scoped_refptr(new PersistentPrefStoreClient(
-        bindings_.CreateInterfacePtrAndBind(backing_pref_store_.get())));
+    return make_scoped_refptr(
+        new PersistentPrefStoreClient(impl_->CreateConnection()));
   }
 
   PersistentPrefStore* pref_store() { return pref_store_.get(); }
@@ -121,8 +124,7 @@
  private:
   base::MessageLoop message_loop_;
 
-  std::unique_ptr<PersistentPrefStoreImpl> backing_pref_store_;
-  mojo::BindingSet<mojom::PersistentPrefStoreConnector> bindings_;
+  std::unique_ptr<PersistentPrefStoreImpl> impl_;
 
   scoped_refptr<PersistentPrefStore> pref_store_;
 
@@ -131,12 +133,9 @@
 
 TEST_F(PersistentPrefStoreImplTest, InitializationSuccess) {
   auto backing_pref_store =
-      make_scoped_refptr(new InitializationMockPersistentPrefStore);
+      make_scoped_refptr(new InitializationMockPersistentPrefStore(
+          true, PersistentPrefStore::PREF_READ_ERROR_NONE, false));
   CreateImpl(backing_pref_store);
-  backing_pref_store->Initialize(
-      true, PersistentPrefStore::PREF_READ_ERROR_NONE, false);
-  EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   EXPECT_TRUE(pref_store()->IsInitializationComplete());
   EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
             pref_store()->GetReadError());
@@ -145,12 +144,9 @@
 
 TEST_F(PersistentPrefStoreImplTest, InitializationFailure) {
   auto backing_pref_store =
-      make_scoped_refptr(new InitializationMockPersistentPrefStore);
+      make_scoped_refptr(new InitializationMockPersistentPrefStore(
+          false, PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE, true));
   CreateImpl(backing_pref_store);
-  backing_pref_store->Initialize(
-      false, PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE, true);
-  EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE,
-            pref_store()->ReadPrefs());
   EXPECT_FALSE(pref_store()->IsInitializationComplete());
   EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE,
             pref_store()->GetReadError());
@@ -176,85 +172,11 @@
   const base::Closure quit_;
 };
 
-TEST_F(PersistentPrefStoreImplTest, InitializationFailure_AsyncRead) {
-  auto backing_pref_store =
-      make_scoped_refptr(new InitializationMockPersistentPrefStore);
-  CreateImpl(backing_pref_store);
-  backing_pref_store->Initialize(
-      false, PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE, true);
-  PersistentPrefStore::PrefReadError read_error =
-      PersistentPrefStore::PREF_READ_ERROR_NONE;
-  base::RunLoop run_loop;
-  pref_store()->ReadPrefsAsync(
-      new TestReadErrorDelegate(&read_error, run_loop.QuitClosure()));
-  run_loop.Run();
-  EXPECT_FALSE(pref_store()->IsInitializationComplete());
-  EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE, read_error);
-  EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE,
-            pref_store()->GetReadError());
-  EXPECT_TRUE(pref_store()->ReadOnly());
-}
-
-TEST_F(PersistentPrefStoreImplTest, DelayedInitializationSuccess) {
-  auto backing_pref_store =
-      make_scoped_refptr(new InitializationMockPersistentPrefStore);
-
-  CreateImpl(backing_pref_store);
-  auto connector = CreateConnector();
-  base::RunLoop run_loop;
-  connector->Connect(base::Bind(
-      [](const base::Closure& quit,
-         PersistentPrefStore::PrefReadError read_error, bool read_only,
-         std::unique_ptr<base::DictionaryValue> local_prefs,
-         mojom::PersistentPrefStorePtr pref_store,
-         mojom::PrefStoreObserverRequest observer_request) {
-        quit.Run();
-        EXPECT_FALSE(read_only);
-        EXPECT_TRUE(local_prefs);
-        EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, read_error);
-      },
-      run_loop.QuitClosure()));
-  connector.FlushForTesting();
-  backing_pref_store->Initialize(
-      true, PersistentPrefStore::PREF_READ_ERROR_NONE, false);
-  run_loop.Run();
-}
-
-TEST_F(PersistentPrefStoreImplTest, DelayedInitializationFailure) {
-  auto backing_pref_store =
-      make_scoped_refptr(new InitializationMockPersistentPrefStore);
-
-  CreateImpl(backing_pref_store);
-  auto connector = CreateConnector();
-  base::RunLoop run_loop;
-  connector->Connect(base::Bind(
-      [](const base::Closure& quit,
-         PersistentPrefStore::PrefReadError read_error, bool read_only,
-         std::unique_ptr<base::DictionaryValue> local_prefs,
-         mojom::PersistentPrefStorePtr pref_store,
-         mojom::PrefStoreObserverRequest observer_request) {
-        quit.Run();
-        EXPECT_TRUE(read_only);
-        EXPECT_FALSE(local_prefs);
-        EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED,
-                  read_error);
-      },
-      run_loop.QuitClosure()));
-  connector.FlushForTesting();
-  backing_pref_store->Initialize(
-      false, PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED, true);
-  run_loop.Run();
-}
-
-constexpr char kKey[] = "path.to.key";
-
 TEST_F(PersistentPrefStoreImplTest, InitialValue) {
   auto backing_pref_store = make_scoped_refptr(new InMemoryPrefStore());
   const base::Value value("value");
   backing_pref_store->SetValue(kKey, value.CreateDeepCopy(), 0);
   CreateImpl(backing_pref_store);
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   EXPECT_TRUE(pref_store()->IsInitializationComplete());
   const base::Value* output = nullptr;
   ASSERT_TRUE(pref_store()->GetValue(kKey, &output));
@@ -267,8 +189,6 @@
   dict.SetStringWithoutPathExpansion(kKey, "value");
   backing_pref_store->SetValue(kKey, dict.CreateDeepCopy(), 0);
   CreateImpl(backing_pref_store);
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   EXPECT_TRUE(pref_store()->IsInitializationComplete());
   const base::Value* output = nullptr;
   ASSERT_TRUE(pref_store()->GetValue(kKey, &output));
@@ -278,13 +198,9 @@
 TEST_F(PersistentPrefStoreImplTest, WriteObservedByOtherClient) {
   auto backing_pref_store = make_scoped_refptr(new InMemoryPrefStore());
   CreateImpl(backing_pref_store);
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   EXPECT_TRUE(pref_store()->IsInitializationComplete());
 
   auto other_pref_store = CreateConnection();
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            other_pref_store->ReadPrefs());
   EXPECT_TRUE(other_pref_store->IsInitializationComplete());
 
   const base::Value value("value");
@@ -308,13 +224,9 @@
        WriteWithoutPathExpansionObservedByOtherClient) {
   auto backing_pref_store = make_scoped_refptr(new InMemoryPrefStore());
   CreateImpl(backing_pref_store);
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   EXPECT_TRUE(pref_store()->IsInitializationComplete());
 
   auto other_pref_store = CreateConnection();
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            other_pref_store->ReadPrefs());
   EXPECT_TRUE(other_pref_store->IsInitializationComplete());
 
   base::DictionaryValue dict;
@@ -340,13 +252,9 @@
   const base::Value value("value");
   backing_pref_store->SetValue(kKey, value.CreateDeepCopy(), 0);
   CreateImpl(backing_pref_store);
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   EXPECT_TRUE(pref_store()->IsInitializationComplete());
 
   auto other_pref_store = CreateConnection();
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            other_pref_store->ReadPrefs());
   EXPECT_TRUE(other_pref_store->IsInitializationComplete());
 
   const base::Value* output = nullptr;
@@ -378,13 +286,9 @@
   dict.SetStringWithoutPathExpansion(kKey, "value");
   backing_pref_store->SetValue(kKey, dict.CreateDeepCopy(), 0);
   CreateImpl(backing_pref_store);
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   EXPECT_TRUE(pref_store()->IsInitializationComplete());
 
   auto other_pref_store = CreateConnection();
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            other_pref_store->ReadPrefs());
   EXPECT_TRUE(other_pref_store->IsInitializationComplete());
 
   const base::Value* output = nullptr;
@@ -417,8 +321,6 @@
 TEST_F(PersistentPrefStoreImplTest, CommitPendingWrite) {
   auto backing_store = make_scoped_refptr(new PersistentPrefStoreMock);
   CreateImpl(backing_store);
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   base::RunLoop run_loop;
   EXPECT_CALL(*backing_store, CommitPendingWrite())
       .Times(2)
@@ -430,8 +332,6 @@
 TEST_F(PersistentPrefStoreImplTest, SchedulePendingLossyWrites) {
   auto backing_store = make_scoped_refptr(new PersistentPrefStoreMock);
   CreateImpl(backing_store);
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   base::RunLoop run_loop;
   EXPECT_CALL(*backing_store, SchedulePendingLossyWrites())
       .Times(1)
@@ -444,8 +344,6 @@
 TEST_F(PersistentPrefStoreImplTest, ClearMutableValues) {
   auto backing_store = make_scoped_refptr(new PersistentPrefStoreMock);
   CreateImpl(backing_store);
-  ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
-            pref_store()->ReadPrefs());
   base::RunLoop run_loop;
   EXPECT_CALL(*backing_store, ClearMutableValues())
       .Times(1)
diff --git a/services/preferences/pref_service_factory_unittest.cc b/services/preferences/pref_service_factory_unittest.cc
index a77ff7a8..462d0d3 100644
--- a/services/preferences/pref_service_factory_unittest.cc
+++ b/services/preferences/pref_service_factory_unittest.cc
@@ -137,8 +137,13 @@
                        std::unique_ptr<PrefService> pref_service) {
     DCHECK(pref_service);
     *out = std::move(pref_service);
-    (*out)->AddPrefInitObserver(
-        base::Bind(PrefServiceFactoryTest::OnInit, quit_closure));
+    if ((*out)->GetInitializationStatus() ==
+        PrefService::INITIALIZATION_STATUS_WAITING) {
+      (*out)->AddPrefInitObserver(
+          base::Bind(PrefServiceFactoryTest::OnInit, quit_closure));
+      return;
+    }
+    quit_closure.Run();
   }
 
   static void OnPrefChanged(const base::Closure& quit_closure,
diff --git a/services/preferences/pref_store_manager_impl.cc b/services/preferences/pref_store_manager_impl.cc
index 75ee88b2..1920039 100644
--- a/services/preferences/pref_store_manager_impl.cc
+++ b/services/preferences/pref_store_manager_impl.cc
@@ -25,15 +25,19 @@
 // Connect calls.
 class ConnectionBarrier : public base::RefCounted<ConnectionBarrier> {
  public:
-  static void Create(const PrefStorePtrs& pref_store_ptrs,
-                     const ConnectCallback& callback);
+  static void Create(
+      const PrefStorePtrs& pref_store_ptrs,
+      mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
+      const ConnectCallback& callback);
 
   void Init(const PrefStorePtrs& pref_store_ptrs);
 
  private:
   friend class base::RefCounted<ConnectionBarrier>;
-  ConnectionBarrier(const PrefStorePtrs& pref_store_ptrs,
-                    const ConnectCallback& callback);
+  ConnectionBarrier(
+      const PrefStorePtrs& pref_store_ptrs,
+      mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
+      const ConnectCallback& callback);
   ~ConnectionBarrier() = default;
 
   void OnConnect(PrefValueStore::PrefStoreType type,
@@ -47,13 +51,19 @@
 
   const size_t expected_connections_;
 
+  mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection_;
+
   DISALLOW_COPY_AND_ASSIGN(ConnectionBarrier);
 };
 
 // static
-void ConnectionBarrier::Create(const PrefStorePtrs& pref_store_ptrs,
-                               const ConnectCallback& callback) {
-  make_scoped_refptr(new ConnectionBarrier(pref_store_ptrs, callback))
+void ConnectionBarrier::Create(
+    const PrefStorePtrs& pref_store_ptrs,
+    mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
+    const ConnectCallback& callback) {
+  make_scoped_refptr(new ConnectionBarrier(
+                         pref_store_ptrs,
+                         std::move(persistent_pref_store_connection), callback))
       ->Init(pref_store_ptrs);
 }
 
@@ -61,7 +71,8 @@
   if (expected_connections_ == 0) {
     // Degenerate case. We don't expect this, but it could happen in
     // e.g. testing.
-    callback_.Run(std::move(connections_));
+    callback_.Run(std::move(persistent_pref_store_connection_),
+                  std::move(connections_));
     return;
   }
   for (const auto& ptr : pref_store_ptrs) {
@@ -70,9 +81,14 @@
   }
 }
 
-ConnectionBarrier::ConnectionBarrier(const PrefStorePtrs& pref_store_ptrs,
-                                     const ConnectCallback& callback)
-    : callback_(callback), expected_connections_(pref_store_ptrs.size()) {}
+ConnectionBarrier::ConnectionBarrier(
+    const PrefStorePtrs& pref_store_ptrs,
+    mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
+    const ConnectCallback& callback)
+    : callback_(callback),
+      expected_connections_(pref_store_ptrs.size()),
+      persistent_pref_store_connection_(
+          std::move(persistent_pref_store_connection)) {}
 
 void ConnectionBarrier::OnConnect(
     PrefValueStore::PrefStoreType type,
@@ -80,8 +96,9 @@
   connections_.insert(std::make_pair(type, std::move(connection_ptr)));
   if (connections_.size() == expected_connections_) {
     // After this method exits |this| will get destroyed so it's safe to move
-    // out the map.
-    callback_.Run(std::move(connections_));
+    // out the members.
+    callback_.Run(std::move(persistent_pref_store_connection_),
+                  std::move(connections_));
   }
 }
 
@@ -112,17 +129,16 @@
   DCHECK(success) << "The same pref store registered twice: " << type;
   if (AllConnected()) {
     DVLOG(1) << "All pref stores registered.";
-    for (const auto& callback : pending_callbacks_)
-      ConnectionBarrier::Create(pref_store_ptrs_, callback);
-    pending_callbacks_.clear();
+    ProcessPendingConnects();
   }
 }
 
 void PrefStoreManagerImpl::Connect(const ConnectCallback& callback) {
-  if (AllConnected())
-    ConnectionBarrier::Create(pref_store_ptrs_, callback);
-  else
+  if (AllConnected()) {
+    ConnectImpl(callback);
+  } else {
     pending_callbacks_.push_back(callback);
+  }
 }
 
 void PrefStoreManagerImpl::Create(
@@ -139,17 +155,6 @@
 
 void PrefStoreManagerImpl::Create(
     const service_manager::Identity& remote_identity,
-    prefs::mojom::PersistentPrefStoreConnectorRequest request) {
-  if (!persistent_pref_store_) {
-    pending_persistent_pref_store_requests_.push_back(std::move(request));
-    return;
-  }
-  persistent_pref_store_bindings_.AddBinding(persistent_pref_store_.get(),
-                                             std::move(request));
-}
-
-void PrefStoreManagerImpl::Create(
-    const service_manager::Identity& remote_identity,
     prefs::mojom::PrefServiceControlRequest request) {
   if (init_binding_.is_bound()) {
     LOG(ERROR)
@@ -165,14 +170,13 @@
     mojom::PersistentPrefStoreConfigurationPtr configuration) {
   DCHECK(!persistent_pref_store_);
 
-  persistent_pref_store_ =
-      CreatePersistentPrefStore(std::move(configuration), worker_pool_.get());
+  persistent_pref_store_ = CreatePersistentPrefStore(
+      std::move(configuration), worker_pool_.get(),
+      base::Bind(&PrefStoreManagerImpl::OnPersistentPrefStoreReady,
+                 base::Unretained(this)));
   DCHECK(persistent_pref_store_);
-  for (auto& request : pending_persistent_pref_store_requests_) {
-    persistent_pref_store_bindings_.AddBinding(persistent_pref_store_.get(),
-                                               std::move(request));
-  }
-  pending_persistent_pref_store_requests_.clear();
+  if (AllConnected())
+    ProcessPendingConnects();
 }
 
 void PrefStoreManagerImpl::OnStart() {}
@@ -182,7 +186,6 @@
     service_manager::InterfaceRegistry* registry) {
   registry->AddInterface<prefs::mojom::PrefStoreConnector>(this);
   registry->AddInterface<prefs::mojom::PrefStoreRegistry>(this);
-  registry->AddInterface<prefs::mojom::PersistentPrefStoreConnector>(this);
   registry->AddInterface<prefs::mojom::PrefServiceControl>(this);
   return true;
 }
@@ -194,7 +197,26 @@
 }
 
 bool PrefStoreManagerImpl::AllConnected() const {
-  return pref_store_ptrs_.size() == expected_pref_stores_.size();
+  return pref_store_ptrs_.size() == expected_pref_stores_.size() &&
+         persistent_pref_store_ && persistent_pref_store_->initialized();
+}
+
+void PrefStoreManagerImpl::ProcessPendingConnects() {
+  for (auto& connect : pending_callbacks_)
+    ConnectImpl(connect);
+  pending_callbacks_.clear();
+}
+
+void PrefStoreManagerImpl::ConnectImpl(const ConnectCallback& callback) {
+  ConnectionBarrier::Create(
+      pref_store_ptrs_, persistent_pref_store_->CreateConnection(), callback);
+}
+
+void PrefStoreManagerImpl::OnPersistentPrefStoreReady() {
+  DVLOG(1) << "PersistentPrefStore ready";
+  if (AllConnected()) {
+    ProcessPendingConnects();
+  }
 }
 
 }  // namespace prefs
diff --git a/services/preferences/pref_store_manager_impl.h b/services/preferences/pref_store_manager_impl.h
index c9f5656..9a6bf2d 100644
--- a/services/preferences/pref_store_manager_impl.h
+++ b/services/preferences/pref_store_manager_impl.h
@@ -35,8 +35,6 @@
       public mojom::PrefStoreConnector,
       public service_manager::InterfaceFactory<mojom::PrefStoreConnector>,
       public service_manager::InterfaceFactory<mojom::PrefStoreRegistry>,
-      public service_manager::InterfaceFactory<
-          mojom::PersistentPrefStoreConnector>,
       public mojom::PrefServiceControl,
       public service_manager::InterfaceFactory<mojom::PrefServiceControl>,
       public service_manager::Service {
@@ -67,11 +65,6 @@
   void Create(const service_manager::Identity& remote_identity,
               prefs::mojom::PrefStoreRegistryRequest request) override;
 
-  // service_manager::InterfaceFactory<PersistentPrefStoreConnector>:
-  void Create(
-      const service_manager::Identity& remote_identity,
-      prefs::mojom::PersistentPrefStoreConnectorRequest request) override;
-
   // service_manager::InterfaceFactory<PrefServiceControl>:
   void Create(const service_manager::Identity& remote_identity,
               prefs::mojom::PrefServiceControlRequest request) override;
@@ -90,6 +83,12 @@
   // Have all the expected PrefStores connected?
   bool AllConnected() const;
 
+  void ProcessPendingConnects();
+
+  void ConnectImpl(const ConnectCallback& callback);
+
+  void OnPersistentPrefStoreReady();
+
   // PrefStores that need to register before replying to any Connect calls.
   std::set<PrefValueStore::PrefStoreType> expected_pref_stores_;
 
@@ -103,15 +102,8 @@
   mojo::BindingSet<mojom::PrefStoreConnector> connector_bindings_;
   mojo::BindingSet<mojom::PrefStoreRegistry> registry_bindings_;
   std::unique_ptr<PersistentPrefStoreImpl> persistent_pref_store_;
-  mojo::BindingSet<mojom::PersistentPrefStoreConnector>
-      persistent_pref_store_bindings_;
   mojo::Binding<mojom::PrefServiceControl> init_binding_;
 
-  // Requests made to connect to the service before it has been initialized.
-  // These will be handled when initialization completes.
-  std::vector<mojom::PersistentPrefStoreConnectorRequest>
-      pending_persistent_pref_store_requests_;
-
   scoped_refptr<base::SequencedWorkerPool> worker_pool_;
 
   DISALLOW_COPY_AND_ASSIGN(PrefStoreManagerImpl);
diff --git a/services/preferences/public/cpp/persistent_pref_store_client.cc b/services/preferences/public/cpp/persistent_pref_store_client.cc
index 032e0816..347db57 100644
--- a/services/preferences/public/cpp/persistent_pref_store_client.cc
+++ b/services/preferences/public/cpp/persistent_pref_store_client.cc
@@ -11,8 +11,17 @@
 namespace prefs {
 
 PersistentPrefStoreClient::PersistentPrefStoreClient(
-    mojom::PersistentPrefStoreConnectorPtr connector)
-    : connector_(std::move(connector)) {}
+    mojom::PrefStoreConnectorPtr connector)
+    : connector_(std::move(connector)) {
+  DCHECK(connector_);
+}
+
+PersistentPrefStoreClient::PersistentPrefStoreClient(
+    mojom::PersistentPrefStoreConnectionPtr connection) {
+  OnConnect(std::move(connection),
+            std::unordered_map<PrefValueStore::PrefStoreType,
+                               prefs::mojom::PrefStoreConnectionPtr>());
+}
 
 void PersistentPrefStoreClient::SetValue(const std::string& key,
                                          std::unique_ptr<base::Value> value,
@@ -65,25 +74,22 @@
 }
 
 PersistentPrefStore::PrefReadError PersistentPrefStoreClient::ReadPrefs() {
-  PrefReadError read_error = PrefReadError::PREF_READ_ERROR_NONE;
-  bool read_only = false;
-  std::unique_ptr<base::DictionaryValue> local_prefs;
-  mojom::PersistentPrefStorePtr pref_store;
-  mojom::PrefStoreObserverRequest observer_request;
-  if (!connector_->Connect(&read_error, &read_only, &local_prefs, &pref_store,
-                           &observer_request)) {
+  mojom::PersistentPrefStoreConnectionPtr connection;
+  std::unordered_map<PrefValueStore::PrefStoreType,
+                     prefs::mojom::PrefStoreConnectionPtr>
+      other_pref_stores;
+  if (!connector_->Connect(&connection, &other_pref_stores)) {
     NOTREACHED();
   }
 
-  OnCreateComplete(read_error, read_only, std::move(local_prefs),
-                   std::move(pref_store), std::move(observer_request));
+  OnConnect(std::move(connection), std::move(other_pref_stores));
   return read_error_;
 }
 
 void PersistentPrefStoreClient::ReadPrefsAsync(
     ReadErrorDelegate* error_delegate) {
   error_delegate_.reset(error_delegate);
-  connector_->Connect(base::Bind(&PersistentPrefStoreClient::OnCreateComplete,
+  connector_->Connect(base::Bind(&PersistentPrefStoreClient::OnConnect,
                                  base::Unretained(this)));
 }
 
@@ -109,21 +115,25 @@
   pref_store_->CommitPendingWrite();
 }
 
-void PersistentPrefStoreClient::OnCreateComplete(
-    PrefReadError read_error,
-    bool read_only,
-    std::unique_ptr<base::DictionaryValue> cached_prefs,
-    mojom::PersistentPrefStorePtr pref_store,
-    mojom::PrefStoreObserverRequest observer_request) {
+void PersistentPrefStoreClient::OnConnect(
+    mojom::PersistentPrefStoreConnectionPtr connection,
+    std::unordered_map<PrefValueStore::PrefStoreType,
+                       prefs::mojom::PrefStoreConnectionPtr>
+        other_pref_stores) {
   connector_.reset();
-  read_error_ = read_error;
-  read_only_ = read_only;
-  pref_store_ = std::move(pref_store);
+  read_error_ = connection->read_error;
+  read_only_ = connection->read_only;
+  pref_store_ = std::move(connection->pref_store);
   if (error_delegate_ && read_error_ != PREF_READ_ERROR_NONE)
     error_delegate_->OnError(read_error_);
   error_delegate_.reset();
 
-  Init(std::move(cached_prefs), true, std::move(observer_request));
+  if (connection->pref_store_connection) {
+    Init(std::move(connection->pref_store_connection->initial_prefs), true,
+         std::move(connection->pref_store_connection->observer));
+  } else {
+    Init(nullptr, false, nullptr);
+  }
 }
 
 }  // namespace prefs
diff --git a/services/preferences/public/cpp/persistent_pref_store_client.h b/services/preferences/public/cpp/persistent_pref_store_client.h
index 7a1a29a..d2dda357 100644
--- a/services/preferences/public/cpp/persistent_pref_store_client.h
+++ b/services/preferences/public/cpp/persistent_pref_store_client.h
@@ -15,7 +15,6 @@
 
 namespace base {
 class Value;
-class DictionaryValue;
 }
 
 namespace prefs {
@@ -25,8 +24,10 @@
 class PersistentPrefStoreClient
     : public PrefStoreClientMixin<PersistentPrefStore> {
  public:
+  explicit PersistentPrefStoreClient(mojom::PrefStoreConnectorPtr connector);
+
   explicit PersistentPrefStoreClient(
-      mojom::PersistentPrefStoreConnectorPtr connector);
+      mojom::PersistentPrefStoreConnectionPtr connection);
 
   // WriteablePrefStore:
   void SetValue(const std::string& key,
@@ -53,13 +54,12 @@
   ~PersistentPrefStoreClient() override;
 
  private:
-  void OnCreateComplete(PrefReadError read_error,
-                        bool read_only,
-                        std::unique_ptr<base::DictionaryValue> cached_prefs,
-                        mojom::PersistentPrefStorePtr pref_store,
-                        mojom::PrefStoreObserverRequest observer_request);
+  void OnConnect(mojom::PersistentPrefStoreConnectionPtr connection,
+                 std::unordered_map<PrefValueStore::PrefStoreType,
+                                    prefs::mojom::PrefStoreConnectionPtr>
+                     other_pref_stores);
 
-  mojom::PersistentPrefStoreConnectorPtr connector_;
+  mojom::PrefStoreConnectorPtr connector_;
   bool read_only_ = false;
   PrefReadError read_error_ = PersistentPrefStore::PREF_READ_ERROR_NONE;
   mojom::PersistentPrefStorePtr pref_store_;
diff --git a/services/preferences/public/cpp/pref_service_factory.cc b/services/preferences/public/cpp/pref_service_factory.cc
index 27067c6..a22df8aa 100644
--- a/services/preferences/public/cpp/pref_service_factory.cc
+++ b/services/preferences/public/cpp/pref_service_factory.cc
@@ -37,33 +37,6 @@
 
 void DoNothingHandleReadError(PersistentPrefStore::PrefReadError error) {}
 
-class ConnectionBarrier : public base::RefCounted<ConnectionBarrier> {
- public:
-  static void Create(service_manager::Connector* connector,
-                     scoped_refptr<PrefRegistry> pref_registry,
-                     ConnectCallback callback);
-
- private:
-  friend class base::RefCounted<ConnectionBarrier>;
-  ConnectionBarrier(scoped_refptr<PrefRegistry> pref_registry,
-                    scoped_refptr<PersistentPrefStore> persistent_pref_store,
-                    ConnectCallback callback);
-  ~ConnectionBarrier() = default;
-
-  void OnConnect(
-      scoped_refptr<RefCountedInterfacePtr<mojom::PrefStoreConnector>> unused,
-      scoped_refptr<PrefRegistry> pref_registry,
-      std::unordered_map<PrefValueStore::PrefStoreType,
-                         mojom::PrefStoreConnectionPtr> connections);
-
-  void OnConnectError(
-      scoped_refptr<RefCountedInterfacePtr<mojom::PrefStoreConnector>> unused);
-
-  scoped_refptr<PrefRegistry> pref_registry_;
-  scoped_refptr<PersistentPrefStore> persistent_pref_store_;
-  ConnectCallback callback_;
-};
-
 scoped_refptr<PrefStore> CreatePrefStore(
     PrefValueStore::PrefStoreType store_type,
     std::unordered_map<PrefValueStore::PrefStoreType,
@@ -77,18 +50,12 @@
   }
 }
 
-ConnectionBarrier::ConnectionBarrier(
-    scoped_refptr<PrefRegistry> pref_registry,
-    scoped_refptr<PersistentPrefStore> persistent_pref_store,
-    ConnectCallback callback)
-    : pref_registry_(std::move(pref_registry)),
-      persistent_pref_store_(std::move(persistent_pref_store)),
-      callback_(std::move(callback)) {}
-
-void ConnectionBarrier::OnConnect(
+void OnConnect(
     scoped_refptr<RefCountedInterfacePtr<mojom::PrefStoreConnector>>
         connector_ptr,
     scoped_refptr<PrefRegistry> pref_registry,
+    ConnectCallback callback,
+    mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
     std::unordered_map<PrefValueStore::PrefStoreType,
                        mojom::PrefStoreConnectionPtr> connections) {
   scoped_refptr<PrefStore> managed_prefs =
@@ -103,56 +70,41 @@
       CreatePrefStore(PrefValueStore::RECOMMENDED_STORE, &connections);
   scoped_refptr<PrefStore> default_prefs =
       CreatePrefStore(PrefValueStore::DEFAULT_STORE, &connections);
+  scoped_refptr<PersistentPrefStore> persistent_pref_store(
+      new PersistentPrefStoreClient(
+          std::move(persistent_pref_store_connection)));
   PrefNotifierImpl* pref_notifier = new PrefNotifierImpl();
   auto* pref_value_store = new PrefValueStore(
       managed_prefs.get(), supervised_user_prefs.get(), extension_prefs.get(),
-      command_line_prefs.get(), persistent_pref_store_.get(),
+      command_line_prefs.get(), persistent_pref_store.get(),
       recommended_prefs.get(), default_prefs.get(), pref_notifier);
-  base::ResetAndReturn(&callback_)
-      .Run(base::MakeUnique<::PrefService>(
-          pref_notifier, pref_value_store, persistent_pref_store_.get(),
-          pref_registry_.get(), base::Bind(&DoNothingHandleReadError), true));
+  callback.Run(base::MakeUnique<::PrefService>(
+      pref_notifier, pref_value_store, persistent_pref_store.get(),
+      pref_registry.get(), base::Bind(&DoNothingHandleReadError), true));
   connector_ptr->reset();
 }
 
-void ConnectionBarrier::OnConnectError(
+void OnConnectError(
     scoped_refptr<RefCountedInterfacePtr<mojom::PrefStoreConnector>>
-        connector_ptr) {
-  callback_.Run(nullptr);
+        connector_ptr,
+    ConnectCallback callback) {
+  callback.Run(nullptr);
   connector_ptr->reset();
 }
 
-// static
-void ConnectionBarrier::Create(service_manager::Connector* connector,
-                               scoped_refptr<PrefRegistry> pref_registry,
-                               ConnectCallback callback) {
-  // Connect to user pref store.
-  mojom::PersistentPrefStoreConnectorPtr persistent_connector_ptr;
-  connector->BindInterface(mojom::kPrefStoreServiceName,
-                           &persistent_connector_ptr);
-  auto barrier = make_scoped_refptr(new ConnectionBarrier(
-      std::move(pref_registry),
-      make_scoped_refptr(
-          new PersistentPrefStoreClient(std::move(persistent_connector_ptr))),
-      std::move(callback)));
-
-  // Connect to all other pref stores.
-  auto connector_ptr = make_scoped_refptr(
-      new RefCountedInterfacePtr<mojom::PrefStoreConnector>());
-  connector->BindInterface(mojom::kPrefStoreServiceName, &connector_ptr->get());
-  connector_ptr->get().set_connection_error_handler(
-      base::Bind(&ConnectionBarrier::OnConnectError, barrier, connector_ptr));
-  connector_ptr->get()->Connect(base::Bind(&ConnectionBarrier::OnConnect,
-                                           barrier, connector_ptr,
-                                           std::move(pref_registry)));
-}
-
 }  // namespace
 
 void ConnectToPrefService(service_manager::Connector* connector,
                           scoped_refptr<PrefRegistry> pref_registry,
-                          const ConnectCallback& callback) {
-  ConnectionBarrier::Create(connector, std::move(pref_registry), callback);
+                          ConnectCallback callback) {
+  auto connector_ptr = make_scoped_refptr(
+      new RefCountedInterfacePtr<mojom::PrefStoreConnector>());
+  connector->BindInterface(mojom::kPrefStoreServiceName, &connector_ptr->get());
+  connector_ptr->get().set_connection_error_handler(base::Bind(
+      &OnConnectError, connector_ptr, base::Passed(ConnectCallback{callback})));
+  connector_ptr->get()->Connect(base::Bind(&OnConnect, connector_ptr,
+                                           base::Passed(&pref_registry),
+                                           base::Passed(&callback)));
 }
 
 }  // namespace prefs
diff --git a/services/preferences/public/cpp/pref_service_factory.h b/services/preferences/public/cpp/pref_service_factory.h
index 0926b06..2967af3e6 100644
--- a/services/preferences/public/cpp/pref_service_factory.h
+++ b/services/preferences/public/cpp/pref_service_factory.h
@@ -36,7 +36,7 @@
 // first.
 void ConnectToPrefService(service_manager::Connector* connector,
                           scoped_refptr<PrefRegistry> pref_registry,
-                          const ConnectCallback& callback);
+                          ConnectCallback callback);
 
 }  // namespace prefs
 
diff --git a/services/preferences/public/cpp/preferences.typemap b/services/preferences/public/cpp/preferences.typemap
index 787ed3f6..d438bedb 100644
--- a/services/preferences/public/cpp/preferences.typemap
+++ b/services/preferences/public/cpp/preferences.typemap
@@ -17,6 +17,6 @@
 ]
 
 type_mappings = [
-  "prefs.mojom.PersistentPrefStoreConnector.ReadError=::PersistentPrefStore::PrefReadError",
+  "prefs.mojom.PersistentPrefStoreConnection.ReadError=::PersistentPrefStore::PrefReadError",
   "prefs.mojom.PrefStoreType=::PrefValueStore::PrefStoreType",
 ]
diff --git a/services/preferences/public/cpp/preferences_struct_traits.cc b/services/preferences/public/cpp/preferences_struct_traits.cc
index da12473..4d22db12 100644
--- a/services/preferences/public/cpp/preferences_struct_traits.cc
+++ b/services/preferences/public/cpp/preferences_struct_traits.cc
@@ -61,7 +61,7 @@
   return false;
 }
 
-using MojomReadError = prefs::mojom::PersistentPrefStoreConnector_ReadError;
+using MojomReadError = prefs::mojom::PersistentPrefStoreConnection_ReadError;
 
 MojomReadError
 EnumTraits<MojomReadError, PersistentPrefStore::PrefReadError>::ToMojom(
diff --git a/services/preferences/public/cpp/preferences_struct_traits.h b/services/preferences/public/cpp/preferences_struct_traits.h
index 568f3717..194d274 100644
--- a/services/preferences/public/cpp/preferences_struct_traits.h
+++ b/services/preferences/public/cpp/preferences_struct_traits.h
@@ -23,13 +23,13 @@
 };
 
 template <>
-struct EnumTraits<::prefs::mojom::PersistentPrefStoreConnector_ReadError,
+struct EnumTraits<::prefs::mojom::PersistentPrefStoreConnection_ReadError,
                   ::PersistentPrefStore::PrefReadError> {
-  static prefs::mojom::PersistentPrefStoreConnector_ReadError ToMojom(
+  static prefs::mojom::PersistentPrefStoreConnection_ReadError ToMojom(
       PersistentPrefStore::PrefReadError input);
 
   static bool FromMojom(
-      prefs::mojom::PersistentPrefStoreConnector_ReadError input,
+      prefs::mojom::PersistentPrefStoreConnection_ReadError input,
       PersistentPrefStore::PrefReadError* output);
 };
 
diff --git a/services/preferences/public/cpp/tests/pref_store_client_unittest.cc b/services/preferences/public/cpp/tests/pref_store_client_unittest.cc
index 5b22727..6a488a1 100644
--- a/services/preferences/public/cpp/tests/pref_store_client_unittest.cc
+++ b/services/preferences/public/cpp/tests/pref_store_client_unittest.cc
@@ -28,11 +28,6 @@
   MOCK_METHOD1(OnInitializationCompleted, void(bool succeeded));
 };
 
-class PrefStoreConnectorMock : public mojom::PrefStoreConnector {
- public:
-  MOCK_METHOD1(Connect, void(const ConnectCallback&));
-};
-
 }  // namespace
 
 class PrefStoreClientTest : public testing::Test {
diff --git a/services/preferences/public/interfaces/preferences.mojom b/services/preferences/public/interfaces/preferences.mojom
index d4258981..0225a848 100644
--- a/services/preferences/public/interfaces/preferences.mojom
+++ b/services/preferences/public/interfaces/preferences.mojom
@@ -69,6 +69,27 @@
   bool is_initialized;
 };
 
+struct PersistentPrefStoreConnection {
+  enum ReadError {
+    NONE = 0,
+    JSON_PARSE = 1,
+    JSON_TYPE = 2,
+    ACCESS_DENIED = 3,
+    FILE_OTHER = 4,
+    FILE_LOCKED = 5,
+    NO_FILE = 6,
+    JSON_REPEAT = 7,
+    // OTHER = 8,  // Deprecated.
+    FILE_NOT_SPECIFIED = 9,
+    ASYNCHRONOUS_TASK_INCOMPLETE = 10,
+  };
+
+  PrefStoreConnection? pref_store_connection;
+  PersistentPrefStore? pref_store;
+  ReadError read_error;
+  bool read_only;
+};
+
 // Manages actual read of preference data. Accepts observers who subscribe to
 // preferences, notifying them of changes.
 interface PrefStore {
@@ -90,7 +111,9 @@
   // Connect to all registered pref stores, retrieving the current values of all
   // prefs in each store and an |observer| interfaces through which updates can
   // be received.
-  Connect() => (map<PrefStoreType, PrefStoreConnection> connections);
+  [Sync]
+  Connect() => (PersistentPrefStoreConnection connection,
+                map<PrefStoreType, PrefStoreConnection> connections);
 };
 
 // An interface providing mutation access to a PersistentPrefStore.
@@ -105,35 +128,6 @@
   ClearMutableValues();
 };
 
-// A connector that provides a way to connect to a PersistentPrefStore.
-interface PersistentPrefStoreConnector {
-  enum ReadError {
-    NONE = 0,
-    JSON_PARSE = 1,
-    JSON_TYPE = 2,
-    ACCESS_DENIED = 3,
-    FILE_OTHER = 4,
-    FILE_LOCKED = 5,
-    NO_FILE = 6,
-    JSON_REPEAT = 7,
-    // OTHER = 8,  // Deprecated.
-    FILE_NOT_SPECIFIED = 9,
-    ASYNCHRONOUS_TASK_INCOMPLETE = 10,
-  };
-
-  // Connects to the PersistentPrefStore.
-  // A null |preferences| indicates that the pref service failed to load prefs.
-  // |pref_store| provides write access; |observer| is used to observe writes
-  // instigated by other clients.
-  [Sync]
-  Connect() => (
-      ReadError read_error,
-      bool read_only,
-      mojo.common.mojom.DictionaryValue? preferences,
-      PersistentPrefStore? pref_store,
-      PrefStoreObserver&? observer);
-};
-
 interface PrefServiceControl {
   // Initializes the pref service. This must be called before the service can
   // be used.
diff --git a/services/ui/gpu/gpu_main.cc b/services/ui/gpu/gpu_main.cc
index 8a7893e..78494671 100644
--- a/services/ui/gpu/gpu_main.cc
+++ b/services/ui/gpu/gpu_main.cc
@@ -7,6 +7,7 @@
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
+#include "base/power_monitor/power_monitor_device_source.h"
 #include "gpu/command_buffer/common/activity_flags.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
 #include "gpu/ipc/gpu_in_process_thread_service.h"
@@ -48,6 +49,7 @@
     : gpu_thread_("GpuThread"),
       io_thread_("GpuIOThread"),
       compositor_thread_("DisplayCompositorThread"),
+      power_monitor_(base::MakeUnique<base::PowerMonitorDeviceSource>()),
       binding_(this, std::move(request)) {
   base::Thread::Options thread_options;
 
diff --git a/services/ui/gpu/gpu_main.h b/services/ui/gpu/gpu_main.h
index 787728af2..8b8ac011 100644
--- a/services/ui/gpu/gpu_main.h
+++ b/services/ui/gpu/gpu_main.h
@@ -5,6 +5,7 @@
 #ifndef SERVICES_UI_GPU_GPU_MAIN_H_
 #define SERVICES_UI_GPU_GPU_MAIN_H_
 
+#include "base/power_monitor/power_monitor.h"
 #include "base/threading/thread.h"
 #include "gpu/ipc/in_process_command_buffer.h"
 #include "gpu/ipc/service/gpu_init.h"
@@ -101,6 +102,7 @@
   base::Thread compositor_thread_;
   scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner_;
 
+  base::PowerMonitor power_monitor_;
   mojo::Binding<mojom::GpuMain> binding_;
 
   DISALLOW_COPY_AND_ASSIGN(GpuMain);
diff --git a/services/ui/gpu/gpu_service.cc b/services/ui/gpu/gpu_service.cc
index 948353c..f26ce292 100644
--- a/services/ui/gpu/gpu_service.cc
+++ b/services/ui/gpu/gpu_service.cc
@@ -8,6 +8,7 @@
 #include "base/debug/crash_logging.h"
 #include "base/lazy_instance.h"
 #include "base/memory/shared_memory.h"
+#include "base/message_loop/message_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "cc/output/in_process_context_provider.h"
@@ -90,11 +91,8 @@
   shutdown_event_.Signal();
 }
 
-void GpuService::InitializeWithHost(mojom::GpuHostPtr gpu_host,
-                                    const gpu::GpuPreferences& preferences,
-                                    gpu::GpuProcessActivityFlags activity_flags,
-                                    gpu::SyncPointManager* sync_point_manager,
-                                    base::WaitableEvent* shutdown_event) {
+void GpuService::UpdateGPUInfoFromPreferences(
+    const gpu::GpuPreferences& preferences) {
   DCHECK(CalledOnValidThread());
   DCHECK(!gpu_host_);
   gpu_preferences_ = preferences;
@@ -105,6 +103,16 @@
   gpu_info_.jpeg_decode_accelerator_supported =
       media::GpuJpegDecodeAcceleratorFactoryProvider::
           IsAcceleratedJpegDecodeSupported();
+  // Record initialization only after collecting the GPU info because that can
+  // take a significant amount of time.
+  gpu_info_.initialization_time = base::Time::Now() - start_time_;
+}
+
+void GpuService::InitializeWithHost(mojom::GpuHostPtr gpu_host,
+                                    const gpu::GpuPreferences& preferences,
+                                    gpu::GpuProcessActivityFlags activity_flags,
+                                    gpu::SyncPointManager* sync_point_manager,
+                                    base::WaitableEvent* shutdown_event) {
   gpu_host->DidInitialize(gpu_info_);
   gpu_host_ =
       mojom::ThreadSafeGpuHostPtr::Create(gpu_host.PassInterface(), io_runner_);
@@ -135,6 +143,8 @@
 
   media_gpu_channel_manager_.reset(
       new media::MediaGpuChannelManager(gpu_channel_manager_.get()));
+  if (watchdog_thread())
+    watchdog_thread()->AddPowerObserver();
 }
 
 void GpuService::Bind(mojom::GpuServiceRequest request) {
@@ -180,6 +190,62 @@
   callback.Run(video_memory_usage_stats);
 }
 
+void GpuService::RequestCompleteGpuInfo(
+    const RequestCompleteGpuInfoCallback& callback) {
+  UpdateGpuInfoPlatform();
+  callback.Run(gpu_info_);
+#if defined(OS_WIN)
+  if (!in_host_process_) {
+    // The unsandboxed GPU process fulfilled its duty. Rest in peace.
+    base::MessageLoop::current()->QuitWhenIdle();
+  }
+#endif
+}
+
+#if defined(OS_MACOSX)
+void GpuService::UpdateGpuInfoPlatform() {
+  // gpu::CollectContextGraphicsInfo() is already called during gpu process
+  // initialization (see GpuInit::InitializeAndStartSandbox()) on non-mac
+  // platforms, and during in-browser gpu thread initialization on all platforms
+  // (See InProcessGpuThread::Init()).
+  if (in_host_process_)
+    return;
+
+  DCHECK_EQ(gpu::kCollectInfoNone, gpu_info_.context_info_state);
+  gpu::CollectInfoResult result = gpu::CollectContextGraphicsInfo(&gpu_info_);
+  switch (result) {
+    case gpu::kCollectInfoFatalFailure:
+      LOG(ERROR) << "gpu::CollectGraphicsInfo failed (fatal).";
+      // TODO(piman): can we signal overall failure?
+      break;
+    case gpu::kCollectInfoNonFatalFailure:
+      DVLOG(1) << "gpu::CollectGraphicsInfo failed (non-fatal).";
+      break;
+    case gpu::kCollectInfoNone:
+      NOTREACHED();
+      break;
+    case gpu::kCollectInfoSuccess:
+      break;
+  }
+  gpu::SetKeysForCrashLogging(gpu_info_);
+}
+#elif defined(OS_WIN)
+void GpuService::UpdateGpuInfoPlatform() {
+  // GPU full info collection should only happen on un-sandboxed GPU process
+  // or single process/in-process gpu mode on Windows.
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  DCHECK(command_line->HasSwitch("disable-gpu-sandbox") || in_host_process_);
+
+  // This is slow, but it's the only thing the unsandboxed GPU process does,
+  // and GpuDataManager prevents us from sending multiple collecting requests,
+  // so it's OK to be blocking.
+  gpu::GetDxDiagnostics(&gpu_info_.dx_diagnostics);
+  gpu_info_.dx_diagnostics_info_state = gpu::kCollectInfoSuccess;
+}
+#else
+void GpuService::UpdateGpuInfoPlatform() {}
+#endif
+
 void GpuService::DidCreateOffscreenContext(const GURL& active_url) {
   (*gpu_host_)->DidCreateOffscreenContext(active_url);
 }
diff --git a/services/ui/gpu/gpu_service.h b/services/ui/gpu/gpu_service.h
index 6525316..6834b9c 100644
--- a/services/ui/gpu/gpu_service.h
+++ b/services/ui/gpu/gpu_service.h
@@ -54,6 +54,8 @@
 
   ~GpuService() override;
 
+  void UpdateGPUInfoFromPreferences(const gpu::GpuPreferences& preferences);
+
   void InitializeWithHost(mojom::GpuHostPtr gpu_host,
                           const gpu::GpuPreferences& preferences,
                           gpu::GpuProcessActivityFlags activity_flags,
@@ -79,6 +81,10 @@
     in_host_process_ = in_host_process;
   }
 
+  void set_start_time(base::Time start_time) { start_time_ = start_time; }
+
+  const gpu::GPUInfo& gpu_info() const { return gpu_info_; }
+
  private:
   friend class GpuMain;
 
@@ -96,7 +102,7 @@
     return gpu_channel_manager_->share_group();
   }
 
-  const gpu::GPUInfo& gpu_info() const { return gpu_info_; }
+  void UpdateGpuInfoPlatform();
 
   // gpu::GpuChannelManagerDelegate:
   void DidCreateOffscreenContext(const GURL& active_url) override;
@@ -135,6 +141,8 @@
                               const gpu::SyncToken& sync_token) override;
   void GetVideoMemoryUsageStats(
       const GetVideoMemoryUsageStatsCallback& callback) override;
+  void RequestCompleteGpuInfo(
+      const RequestCompleteGpuInfoCallback& callback) override;
   void LoadedShader(const std::string& data) override;
   void DestroyingVideoSurface(
       int32_t surface_id,
@@ -174,6 +182,7 @@
 
   // Whether this is running in the same process as the gpu host.
   bool in_host_process_ = false;
+  base::Time start_time_;
 
   mojo::BindingSet<mojom::GpuService> bindings_;
 
diff --git a/services/ui/gpu/interfaces/gpu_service.mojom b/services/ui/gpu/interfaces/gpu_service.mojom
index cf3a7ec..eb2c89b6 100644
--- a/services/ui/gpu/interfaces/gpu_service.mojom
+++ b/services/ui/gpu/interfaces/gpu_service.mojom
@@ -39,6 +39,8 @@
 
   GetVideoMemoryUsageStats() => (gpu.mojom.VideoMemoryUsageStats stats);
 
+  RequestCompleteGpuInfo() => (gpu.mojom.GpuInfo gpu_info);
+
   // Notify GPU that a shader was loaded from disk.
   LoadedShader(string data);
 
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 44497469..523e759c 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -2771,6 +2771,45 @@
         "test": "chrome_public_test_apk"
       },
       {
+        "args": [
+          "--enable-browser-side-navigation"
+        ],
+        "name": "browser_side_navigation_chrome_public_test_apk",
+        "override_compile_targets": [
+          "chrome_public_test_apk"
+        ],
+        "override_isolate_target": "chrome_public_test_apk",
+        "render_results_dir": "chrome/test/data/android/render_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device_os": "MMB29Q",
+              "device_type": "bullhead"
+            }
+          ],
+          "hard_timeout": 1800,
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ]
+        },
+        "test": "chrome_public_test_apk"
+      },
+      {
         "override_compile_targets": [
           "chrome_sync_shell_test_apk"
         ],
diff --git a/testing/buildbot/filters/mash.browser_tests.filter b/testing/buildbot/filters/mash.browser_tests.filter
index 5916eae..cfb33bb 100644
--- a/testing/buildbot/filters/mash.browser_tests.filter
+++ b/testing/buildbot/filters/mash.browser_tests.filter
@@ -1,2 +1,43 @@
 BrowserTest.NoTitle
 BrowserTest.Title
+BrowserTest.ClearPendingOnFailUnlessNTP
+BrowserTest.SadTabCancelsDialogs
+BrowserTest.SadTabCancelsSubframeDialogs
+BrowserTest.InterstitialCancelsGuestViewDialogs
+BrowserTest.CancelBeforeUnloadResetsURL
+BrowserTest.BeforeUnloadVsBeforeReload
+BrowserTest.NullOpenerRedirectForksProcess
+BrowserTest.OtherRedirectsDontForkProcess
+BrowserTest.RenderIdleTime
+BrowserTest.CommandCreateAppShortcutFile
+BrowserTest.CommandCreateAppShortcutHttp
+BrowserTest.SingleBeforeUnloadAfterRedirect
+BrowserTest.JavascriptAlertActivatesTab
+BrowsetTest.ThirtyFourTabs
+BrowserTest.ReloadThenCancelBeforeUnload
+BrowserTest.CommandCreateAppShortcutHttps
+BrowserTest.CommandCreateAppShortcutInvalid
+BrowserTest.TabClosingWhenRemovingExtension
+BrowserTest.AppIdSwitch
+BrowserTest.ShouldShowLocationBar
+BrowserTest.RestorePinnedTabs
+BrowserTest.CloseWithAppMenuOpen
+BrowserTest.OpenAppWindowLikeNtp
+BrowserTest.StartMaximized
+BrowserTest.StartMinimized
+BrowserTest.ForwardDisabledOnForward
+BrowserTest.DisableMenuItemsWhenIncognitoIsForced
+BrowserTest.NoNewIncognitoWindowWhenIncognitoIsDisabled
+BrowserTest.DisableExtensionsAndSettingsWhenIncognitoIsDisabled
+BrowserTest.PageZoom
+BrowserTest.InterstitialCommandDisable
+BrowserTest.InterstitialClosesDialogs
+BrowserTest.InterstitialCloseTab
+BrowserTest.UserGesturesReported
+BrowserTest.WindowOpenClose
+BrowserTest.DisallowFileUrlUniversalAccessTest
+BrowserTest.AboutVersion
+BrowserTest.GetSizeForNewRenderView
+BrowserTest.CanDuplicateTab
+BrowserTest.DefaultMediaDevices
+BrowserTest.TestPopupBounds
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index d1ab7563e..ca0334c9 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -137,8 +137,9 @@
 # LayoutNG - is a new layout system for Blink.
 
 #### css2.1/20110323
-#### Passed: 226
-#### Skipped: 183
+#### Passed: 225
+#### Skipped: 184
+crbug.com/635619 virtual/layout_ng/css2.1/20110323/inline-block-non-replaced-width-001.htm [ Skip ]
 crbug.com/635619 virtual/layout_ng/css2.1/20110323/absolute-non-replaced-height-006.htm [ Skip ]
 crbug.com/635619 virtual/layout_ng/css2.1/20110323/absolute-non-replaced-height-008.htm [ Skip ]
 crbug.com/635619 virtual/layout_ng/css2.1/20110323/absolute-non-replaced-max-height-008.htm [ Skip ]
@@ -420,14 +421,9 @@
 
 #### fast/block/float
 #### Total: 209
-#### Passed: 16
-#### Skipped: 190
-#### Failed: 3
-crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-6.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/br-with-clear.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-in-float-hit-testing.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-in-float-painting.html [ Skip ]
+#### Passed: 29
+#### Skipped: 176
+crbug.com/635619 virtual/layout_ng/fast/block/float/001.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/002.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/003.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/004.html [ Skip ]
@@ -436,14 +432,18 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/007.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/008.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/009.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/010.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/011.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/012.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/013.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/014.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/015.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/016.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/017.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/018.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/019.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/020.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/021.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/022.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/023.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/024.html [ Skip ]
@@ -459,15 +459,18 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/034.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/035.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/4145535Crash.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/add-float-back-to-anonymous-block-previous.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/add-float-back-to-anonymous-block.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/add-inline-before-float-and-after-anonymous-block.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/add-inline-before-float-in-block-children-block.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/add-inline-between-floats-with-preceding-anonymous-box.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/add-inline-to-block-flow-and-ensure-layout-on-containers-of-removed-floats.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/add-inline-to-block-flow-with-block-children-that-do-not-need-anonymous-boxes.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/add-inlines-in-block-children-block.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/assert-when-moving-float.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-2.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-3.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-4.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-5.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-6.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-with-negative-margins.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/avoidance-percent-width-compat.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/avoidance-percent-width-strict.html [ Skip ]
@@ -475,6 +478,7 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/avoiding-float-centered.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/block-with-negative-margin-clears-float.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/br-with-clear-2.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/br-with-clear.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/centered-float-avoidance-complexity.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/checkbox-and-radio-avoid-floats.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/clamped-right-float.html [ Skip ]
@@ -494,8 +498,12 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-avoidance.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-change-composited-scrolling.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-forced-below-other-floats.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-in-float-hit-testing.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-in-float-painting.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-inserted-into-clean-line.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-from-first-letter.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-list-changed-before-layout-crash.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-mark-descendants-for-layout-crash.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-crash2.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-from-next-sibling-crash.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-from-next-sibling.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-from-next-sibling2.html [ Skip ]
@@ -503,10 +511,20 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-from-next-sibling5.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-from-pre-block.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-on-empty-line.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-on-line-large-and-small-float-below.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-on-line-obeys-container-padding.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-on-zero-height-line.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-overflow-hidden-containing-block-width.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-overhangs-root.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-reinsertion-failure.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-reparent-during-detach-crash.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-even-when-it-doesnt-intersect-it-2.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-even-when-it-doesnt-intersect-it-3.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-even-when-it-doesnt-intersect-it.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks-2.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/floats-and-text-indent-rl.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/floats-and-text-indent.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/floats-do-not-overhang-from-block-formatting-context.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/floats-offset-image-quirk-line-height.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/floats-offset-image-quirk.html [ Skip ]
@@ -525,6 +543,7 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/independent-align-positioning.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-float-add-in-sibling-block-on-static-position.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-float-add-in-sibling-block-on-static-position2.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-float-not-removed-writing-mode.xhtml [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-float-remove-from-sibling-block-on-absolute-position.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-float-remove-from-sibling-block-on-absolute-position2.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-float-remove-from-sibling-block-on-fixed-position.html [ Skip ]
@@ -533,6 +552,7 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-painted-twice.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/logical-bottom-exceeds-layoutunit-max.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/marquee-shrink-to-avoid-floats.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/max-width-clear-float-with-overflow-hidden.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/multiple-float-positioning.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/narrow-after-wide.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/negative-margin-clear.html [ Skip ]
@@ -540,6 +560,7 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/negative-margin-on-element-avoiding-floats.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/nested-clearance.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/nested-floats-expand-formatting-context.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/nestedAnonymousBlocks.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/nestedAnonymousBlocks2.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/nopaint-after-layer-destruction.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/nopaint-after-layer-destruction2.html [ Skip ]
@@ -554,6 +575,8 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/overhanging-float-remove-from-fixed-position-block.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/overhanging-float-remove-from-fixed-position-block2.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/overhanging-tall-block.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/overhanging-from-second-last-sibling.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/overhanging-from-third-last-sibling.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/overlapping-floats-paint-hittest-order-1.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/overlapping-floats-paint-hittest-order-2.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/overlapping-floats-with-overflow-hidden.html [ Skip ]
@@ -563,53 +586,23 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/previous-sibling-float-001.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/previous-sibling-float-002.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/relative-painted-twice.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/relayout-nested-float-after-line.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/remove-line-above-float-above-line-crash.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-made-inline-crash.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash-2.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/selection-gap-clip-out-tiger-crash.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/shrink-to-avoid-float-complexity.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/shrink-to-fit-width.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/split-inline-sibling-of-float-crash.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/table-relayout.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/trailing-float-layout-2.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/trailing-float-layout.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/trailing-float-with-columns.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/trailing-float-with-content.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/trailing-float.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/vertical-move-relayout.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/width-update-after-clear.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/001.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/010.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/017.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/018.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/021.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-2.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-3.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-4.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-5.html [ Failure Crash ]
-# ng_floats_utils.cc(144)] Check failed: !opportunity.IsEmpty(). Opportunity is empty but it shouldn't be
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-crash2.html [ Failure Crash ]
-# layout_ng_block_flow.h(28)] Security DCHECK failed: !object || (object->isLayoutNGBlockFlow())
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks-2.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-float-not-removed-writing-mode.xhtml [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/overhanging-float-crashes-when-sibling-becomes-formatting-context.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-list-changed-before-layout-crash.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-on-line-large-and-small-float-below.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-on-line-obeys-container-padding.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-reparent-during-detach-crash.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-even-when-it-doesnt-intersect-it-2.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-even-when-it-doesnt-intersect-it.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/floats-and-text-indent-rl.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/floats-and-text-indent.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/nestedAnonymousBlocks.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/split-inline-sibling-of-float-crash.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/trailing-float-layout-2.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/trailing-float-layout.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-mark-descendants-for-layout-crash.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-even-when-it-doesnt-intersect-it-3.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-from-first-letter.html [ Skip ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/floats-not-cleared-from-grand-parents.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/line-break-after-white-space-crash.html [ Skip ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/max-width-clear-float-with-overflow-hidden.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/relayout-nested-float-after-line.html [ Skip ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/selection-gap-clip-out-tiger-crash.html [ Skip ]
 
 #### external/csswg-test/css21/linebox
 #### Passed: 84
@@ -635,6 +628,7 @@
 crbug.com/636993 virtual/layout_ng/external/csswg-test/css21/linebox/line-height-002.xht [ Skip ]
 crbug.com/636993 virtual/layout_ng/external/csswg-test/css21/linebox/line-height-004.xht [ Skip ]
 crbug.com/636993 virtual/layout_ng/external/csswg-test/css21/linebox/line-height-005.xht [ Skip ]
+crbug.com/636993 virtual/layout_ng/external/csswg-test/css21/linebox/line-height-applies-to-012.xht [ Skip ]
 crbug.com/636993 virtual/layout_ng/external/csswg-test/css21/linebox/line-height-013.xht [ Skip ]
 crbug.com/636993 virtual/layout_ng/external/csswg-test/css21/linebox/line-height-015.xht [ Skip ]
 crbug.com/636993 virtual/layout_ng/external/csswg-test/css21/linebox/line-height-016.xht [ Skip ]
@@ -750,6 +744,19 @@
 crbug.com/520737 [ Mac ] external/csswg-test/css-writing-modes-3/writing-mode-vertical-rl-001.xht [ Failure Pass Timeout ]
 crbug.com/520736 [ Win7 ] media/W3C/video/networkState/networkState_during_progress.html [ Failure Pass ]
 
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/clip-path-child-changes.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/feImage-multiple-targets-id-change.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/feImage-target-attribute-change.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/feImage-target-inline-style-change.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/feImage-target-property-change.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/feImage-target-style-change.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/js-late-mask-creation.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/js-update-pattern-child.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/js-update-pattern.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/mask-child-changes.svg [ NeedsRebaseline ]
+crbug.com/665259 virtual/disable-spinvalidation/paint/invalidation/svg/pending-resource-after-removal.xhtml [ NeedsRebaseline ]
+
+
 crbug.com/522648 fast/events/touch/compositor-touch-hit-rects-iframes.html [ Crash Failure Pass ]
 crbug.com/521858 [ Win7 ] http/tests/security/media-element-audio-source-node-same-origin.html [ Failure Pass ]
 crbug.com/521858 [ Win7 ] virtual/mojo-loading/http/tests/security/media-element-audio-source-node-same-origin.html [ Failure Pass ]
@@ -850,6 +857,7 @@
 
 # Will be re-enabled and rebaselined once we remove the '--enable-file-cookies' flag.
 crbug.com/470482 fast/cookies/local-file-can-set-cookies.html [ Skip ]
+crbug.com/704850 fast/forms/calendar-picker/calendar-picker-appearance-coarse.html [ NeedsRebaseline ]
 
 # Text::inDocument() returns false but should not.
 crbug.com/264138 dom/legacy_dom_conformance/xhtml/level3/core/nodecomparedocumentposition38.xhtml [ Failure ]
@@ -2117,7 +2125,6 @@
 crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/size_50.html [ Failure ]
 crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/too_many_cues.html [ Failure ]
 crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/too_many_cues_wrapped.html [ Failure ]
-crbug.com/626703 external/wpt/referrer-policy/generic/subresource-test/image-decoding.html [ Timeout ]
 crbug.com/626703 external/wpt/streams/writable-streams/close.dedicatedworker.html [ Timeout ]
 crbug.com/626703 external/wpt/streams/writable-streams/close.html [ Timeout ]
 crbug.com/626703 external/wpt/streams/writable-streams/close.serviceworker.https.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/VirtualTestSuites b/third_party/WebKit/LayoutTests/VirtualTestSuites
index 349145f9..9d319944 100644
--- a/third_party/WebKit/LayoutTests/VirtualTestSuites
+++ b/third_party/WebKit/LayoutTests/VirtualTestSuites
@@ -338,27 +338,27 @@
   {
     "prefix": "layout_ng",
     "base": "fast/block/basic",
-    "args": ["--enable-blink-features=LayoutNG, LayoutNGInline"]
+    "args": ["--enable-blink-features=LayoutNG"]
   },
   {
     "prefix": "layout_ng",
     "base": "fast/block/margin-collapse",
-    "args": ["--enable-blink-features=LayoutNG, LayoutNGInline"]
+    "args": ["--enable-blink-features=LayoutNG"]
   },
   {
     "prefix": "layout_ng",
     "base": "css2.1/20110323",
-    "args": ["--enable-blink-features=LayoutNG, LayoutNGInline"]
+    "args": ["--enable-blink-features=LayoutNG"]
   },
   {
     "prefix": "layout_ng",
     "base": "fast/block/float",
-    "args": ["--enable-blink-features=LayoutNG, LayoutNGInline"]
+    "args": ["--enable-blink-features=LayoutNG"]
   },
   {
     "prefix": "layout_ng",
     "base": "external/csswg-test/css21/linebox",
-    "args": ["--enable-blink-features=LayoutNG, LayoutNGInline"]
+    "args": ["--enable-blink-features=LayoutNG"]
   },
   {
     "prefix": "feature-policy",
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.js b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.js
deleted file mode 100644
index e3404c2e..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
-Copyright © 2001-2004 World Wide Web Consortium,
-(Massachusetts Institute of Technology, European Research Consortium
-for Informatics and Mathematics, Keio University). All
-Rights Reserved. This work is distributed under the W3C® Software License [1] in the
-hope that it will be useful, but WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
-*/
-
-   /**
-    *  Gets URI that identifies the test.
-    *  @return uri identifier of test
-    */
-function getTargetURI() {
-      return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetdocumenturi02";
-   }
-
-var docsLoaded = -1000000;
-var builder = null;
-
-//
-//   This function is called by the testing framework before
-//      running the test suite.
-//
-//   If there are no configuration exceptions, asynchronous
-//        document loading is started.  Otherwise, the status
-//        is set to complete and the exception is immediately
-//        raised when entering the body of the test.
-//
-function setUpPage() {
-   setUpPageStatus = 'running';
-   try {
-     //
-     //   creates test document builder, may throw exception
-     //
-     builder = createConfiguredBuilder();
-
-      docsLoaded = 0;
-
-      var docRef = null;
-      if (typeof(this.doc) != 'undefined') {
-        docRef = this.doc;
-      }
-      docsLoaded += preload(docRef, "doc", "hc_staff");
-
-       if (docsLoaded == 1) {
-          setUpPageStatus = 'complete';
-       }
-    } catch(ex) {
-        catchInitializationError(builder, ex);
-        setUpPageStatus = 'complete';
-    }
-}
-
-//
-//   This method is called on the completion of
-//      each asychronous load started in setUpTests.
-//
-//   When every synchronous loaded document has completed,
-//      the page status is changed which allows the
-//      body of the test to be executed.
-function loadComplete() {
-    if (++docsLoaded == 1) {
-        setUpPageStatus = 'complete';
-    }
-}
-
-/**
-*
-    Create a new Document, retrieve its documentURI, and verify if it is null.
-
-* @author IBM
-* @author Neil Delima
-* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Document3-documentURI
-*/
-function documentgetdocumenturi02() {
-   var success;
-    if(checkInitialization(builder, "documentgetdocumenturi02") != null) return;
-    var doc;
-      var newDoc;
-      var docURI;
-      var domImpl;
-      var nullDocType = null;
-
-      var docElem;
-      var rootNS;
-      var rootName;
-
-      var docRef = null;
-      if (typeof(this.doc) != 'undefined') {
-        docRef = this.doc;
-      }
-      doc = load(docRef, "doc", "hc_staff");
-      docElem = doc.documentElement;
-
-      rootNS = docElem.namespaceURI;
-
-      rootName = docElem.tagName;
-
-      domImpl = doc.implementation;
-newDoc = domImpl.createDocument(rootNS,rootName,nullDocType);
-      docURI = newDoc.documentURI;
-
-      assertNull("documentgetdocumenturi02",docURI);
-
-}
-
-function runTest() {
-   documentgetdocumenturi02();
-}
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.xhtml b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.xhtml
deleted file mode 100644
index 8249bcdf..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.xhtml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0"?><?TEST-STYLE PIDATA?>
-<!DOCTYPE html
-   PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-   "xhtml1-strict.dtd" [
-   <!ENTITY alpha "&#945;">
-   <!ENTITY beta "&#946;">
-   <!ENTITY gamma "&#947;">
-   <!ENTITY delta "&#948;">
-   <!ENTITY epsilon "&#949;">
-   <!ENTITY alpha "&#950;">
-   <!NOTATION notation1 PUBLIC "notation1File">
-   <!NOTATION notation2 SYSTEM "notation2File">
-   <!ATTLIST p
-        dir CDATA 'rtl'
-        xmlns:dmstc CDATA #IMPLIED
-        xmlns:nm CDATA #IMPLIED
-        xmlns:emp2 CDATA #IMPLIED>
-   <!ATTLIST html
-                   xmlns:xsi CDATA #IMPLIED
-                   xsi:schemaLocation CDATA #IMPLIED>
-   <!ATTLIST acronym xsi:noNamespaceSchemaLocation CDATA #IMPLIED>
-   <!ENTITY ent4 "<span xmlns='http://www.w3.org/1999/xhtml'>Element data</span><?PItarget PIdata?>">
-   <!ATTLIST span xmlns CDATA #IMPLIED>
-]>
-<!-- This is comment number 1.-->
-<html xmlns='http://www.w3.org/1999/xhtml'
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://www.w3.org/1999/xhtml hc_staff.xsd"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>hc_staff</title><script type="text/javascript" src="selfxhtml.js"/><script charset="UTF-8" type="text/javascript" src="documentgetdocumenturi02.js"/><script type='text/javascript'>function loadComplete() { startTest(); }</script></head><body onload="loadComplete()">
- <p xmlns:dmstc="http://www.usa.com">
-  <em>EMP0001</em>
-  <strong>Margaret Martin</strong>
-  <code>Accountant</code>
-  <sup>56,000</sup>
-  <var>Female</var>
-  <acronym title="Yes" xsi:noNamespaceSchemaLocation="Yes">1230 North Ave. Dallas, Texas 98551</acronym>
- </p>
- <p xmlns:dmstc="http://www.usa.com">
-  <em>EMP0002</em>
-  <strong>Martha Raynolds
-<![CDATA[This is a CDATASection with EntityReference number 2 &ent2;]]>
-<![CDATA[This is an adjacent CDATASection with a reference to a tab &tab;]]></strong>
-  <code>Secretary</code>
-  <sup>35,000</sup>
-  <var>Female</var>
-  <acronym title="Yes" class="Yes" xsi:noNamespaceSchemaLocation="Yes">&beta; Dallas, &gamma;
- 98554</acronym>
- </p>
- <p xmlns:dmstc="http://www.netzero.com">
-  <em>EMP0003</em>
-  <strong>Roger
- Jones</strong>
-  <code>Department Manager</code>
-  <sup>100,000</sup>
-  <var>&ent4;</var>
-  <acronym title="Yes" class="No" id="_98553" xsi:noNamespaceSchemaLocation="Yes">PO Box 27 Irving, texas 98553</acronym>
- </p>
- <p xmlns:nm="http://www.altavista.com">
-  <em>EMP0004</em>
-  <strong>Jeny Oconnor</strong>
-  <code>Personnel Director</code>
-  <sup>95,000</sup>
-  <var>Female</var>
-  <acronym title="Yes" class="Y&alpha;" id="_98556" xsi:noNamespaceSchemaLocation="Yes">27 South Road. Dallas, Texas 98556</acronym>
- </p>
- <p xmlns:emp2="http://www.nist.gov">
-  <em>EMP0005</em>
-  <strong>Robert Myers</strong>
-  <code>Computer Specialist</code>
-  <sup>90,000</sup>
-  <var>male</var>
-  <acronym title="Yes" class="Yes" xsi:noNamespaceSchemaLocation="Yes">1821 Nordic. Road, Irving Texas 98558</acronym>
- </p>
-</body></html>
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03-expected.txt b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03-expected.txt
deleted file mode 100644
index 4b4a283..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03-expected.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Test	http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetdocumenturi03
-Status	Success
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.js b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.js
deleted file mode 100644
index 4749742..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.js
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-Copyright © 2001-2004 World Wide Web Consortium,
-(Massachusetts Institute of Technology, European Research Consortium
-for Informatics and Mathematics, Keio University). All
-Rights Reserved. This work is distributed under the W3C® Software License [1] in the
-hope that it will be useful, but WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
-*/
-
-   /**
-    *  Gets URI that identifies the test.
-    *  @return uri identifier of test
-    */
-function getTargetURI() {
-      return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetdocumenturi03";
-   }
-
-var docsLoaded = -1000000;
-var builder = null;
-
-//
-//   This function is called by the testing framework before
-//      running the test suite.
-//
-//   If there are no configuration exceptions, asynchronous
-//        document loading is started.  Otherwise, the status
-//        is set to complete and the exception is immediately
-//        raised when entering the body of the test.
-//
-function setUpPage() {
-   setUpPageStatus = 'running';
-   try {
-     //
-     //   creates test document builder, may throw exception
-     //
-     builder = createConfiguredBuilder();
-
-      docsLoaded = 0;
-
-      var docRef = null;
-      if (typeof(this.doc) != 'undefined') {
-        docRef = this.doc;
-      }
-      docsLoaded += preload(docRef, "doc", "hc_staff");
-
-       if (docsLoaded == 1) {
-          setUpPageStatus = 'complete';
-       }
-    } catch(ex) {
-        catchInitializationError(builder, ex);
-        setUpPageStatus = 'complete';
-    }
-}
-
-//
-//   This method is called on the completion of
-//      each asychronous load started in setUpTests.
-//
-//   When every synchronous loaded document has completed,
-//      the page status is changed which allows the
-//      body of the test to be executed.
-function loadComplete() {
-    if (++docsLoaded == 1) {
-        setUpPageStatus = 'complete';
-    }
-}
-
-/**
-*
-    Import the documentElement node of this document into a new document.  Since this node is
-    now owned by the importing document, its documentURI attribute value should be null
-
-* @author IBM
-* @author Neil Delima
-* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Document3-documentURI
-*/
-function documentgetdocumenturi03() {
-   var success;
-    if(checkInitialization(builder, "documentgetdocumenturi03") != null) return;
-    var doc;
-      var newDoc;
-      var importedOwner;
-      var docElem;
-      var docElemImported;
-      var docURI;
-      var domImpl;
-      var nullDocType = null;
-
-      var rootNS;
-      var rootName;
-
-      var docRef = null;
-      if (typeof(this.doc) != 'undefined') {
-        docRef = this.doc;
-      }
-      doc = load(docRef, "doc", "hc_staff");
-      domImpl = doc.implementation;
-docElem = doc.documentElement;
-
-      rootNS = docElem.namespaceURI;
-
-      rootName = docElem.tagName;
-
-      newDoc = domImpl.createDocument(rootNS,rootName,nullDocType);
-      docElemImported = newDoc.importNode(docElem,false);
-      importedOwner = docElemImported.ownerDocument;
-
-      docURI = importedOwner.documentURI;
-
-      assertNull("documentgetdocumenturi03",docURI);
-
-}
-
-function runTest() {
-   documentgetdocumenturi03();
-}
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.xhtml b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.xhtml
deleted file mode 100644
index b4af585ca..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.xhtml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0"?><?TEST-STYLE PIDATA?>
-<!DOCTYPE html
-   PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-   "xhtml1-strict.dtd" [
-   <!ENTITY alpha "&#945;">
-   <!ENTITY beta "&#946;">
-   <!ENTITY gamma "&#947;">
-   <!ENTITY delta "&#948;">
-   <!ENTITY epsilon "&#949;">
-   <!ENTITY alpha "&#950;">
-   <!NOTATION notation1 PUBLIC "notation1File">
-   <!NOTATION notation2 SYSTEM "notation2File">
-   <!ATTLIST p
-        dir CDATA 'rtl'
-        xmlns:dmstc CDATA #IMPLIED
-        xmlns:nm CDATA #IMPLIED
-        xmlns:emp2 CDATA #IMPLIED>
-   <!ATTLIST html
-                   xmlns:xsi CDATA #IMPLIED
-                   xsi:schemaLocation CDATA #IMPLIED>
-   <!ATTLIST acronym xsi:noNamespaceSchemaLocation CDATA #IMPLIED>
-   <!ENTITY ent4 "<span xmlns='http://www.w3.org/1999/xhtml'>Element data</span><?PItarget PIdata?>">
-   <!ATTLIST span xmlns CDATA #IMPLIED>
-]>
-<!-- This is comment number 1.-->
-<html xmlns='http://www.w3.org/1999/xhtml'
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://www.w3.org/1999/xhtml hc_staff.xsd"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>hc_staff</title><script type="text/javascript" src="selfxhtml.js"/><script charset="UTF-8" type="text/javascript" src="documentgetdocumenturi03.js"/><script type='text/javascript'>function loadComplete() { startTest(); }</script></head><body onload="loadComplete()">
- <p xmlns:dmstc="http://www.usa.com">
-  <em>EMP0001</em>
-  <strong>Margaret Martin</strong>
-  <code>Accountant</code>
-  <sup>56,000</sup>
-  <var>Female</var>
-  <acronym title="Yes" xsi:noNamespaceSchemaLocation="Yes">1230 North Ave. Dallas, Texas 98551</acronym>
- </p>
- <p xmlns:dmstc="http://www.usa.com">
-  <em>EMP0002</em>
-  <strong>Martha Raynolds
-<![CDATA[This is a CDATASection with EntityReference number 2 &ent2;]]>
-<![CDATA[This is an adjacent CDATASection with a reference to a tab &tab;]]></strong>
-  <code>Secretary</code>
-  <sup>35,000</sup>
-  <var>Female</var>
-  <acronym title="Yes" class="Yes" xsi:noNamespaceSchemaLocation="Yes">&beta; Dallas, &gamma;
- 98554</acronym>
- </p>
- <p xmlns:dmstc="http://www.netzero.com">
-  <em>EMP0003</em>
-  <strong>Roger
- Jones</strong>
-  <code>Department Manager</code>
-  <sup>100,000</sup>
-  <var>&ent4;</var>
-  <acronym title="Yes" class="No" id="_98553" xsi:noNamespaceSchemaLocation="Yes">PO Box 27 Irving, texas 98553</acronym>
- </p>
- <p xmlns:nm="http://www.altavista.com">
-  <em>EMP0004</em>
-  <strong>Jeny Oconnor</strong>
-  <code>Personnel Director</code>
-  <sup>95,000</sup>
-  <var>Female</var>
-  <acronym title="Yes" class="Y&alpha;" id="_98556" xsi:noNamespaceSchemaLocation="Yes">27 South Road. Dallas, Texas 98556</acronym>
- </p>
- <p xmlns:emp2="http://www.nist.gov">
-  <em>EMP0005</em>
-  <strong>Robert Myers</strong>
-  <code>Computer Specialist</code>
-  <sup>90,000</sup>
-  <var>male</var>
-  <acronym title="Yes" class="Yes" xsi:noNamespaceSchemaLocation="Yes">1821 Nordic. Road, Irving Texas 98558</acronym>
- </p>
-</body></html>
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03-expected.txt b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03-expected.txt
deleted file mode 100644
index 8a3e30b9..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Test	http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentsetdocumenturi03
-Status	failure
-Message	documentsetdocumenturi03: assertEquals failed, actual null, expected somestring.
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.js b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.js
deleted file mode 100644
index 697c555a..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
-Copyright © 2001-2004 World Wide Web Consortium,
-(Massachusetts Institute of Technology, European Research Consortium
-for Informatics and Mathematics, Keio University). All
-Rights Reserved. This work is distributed under the W3C® Software License [1] in the
-hope that it will be useful, but WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
-*/
-
-   /**
-    *  Gets URI that identifies the test.
-    *  @return uri identifier of test
-    */
-function getTargetURI() {
-      return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentsetdocumenturi03";
-   }
-
-var docsLoaded = -1000000;
-var builder = null;
-
-//
-//   This function is called by the testing framework before
-//      running the test suite.
-//
-//   If there are no configuration exceptions, asynchronous
-//        document loading is started.  Otherwise, the status
-//        is set to complete and the exception is immediately
-//        raised when entering the body of the test.
-//
-function setUpPage() {
-   setUpPageStatus = 'running';
-   try {
-     //
-     //   creates test document builder, may throw exception
-     //
-     builder = createConfiguredBuilder();
-
-      docsLoaded = 0;
-
-      var docRef = null;
-      if (typeof(this.doc) != 'undefined') {
-        docRef = this.doc;
-      }
-      docsLoaded += preload(docRef, "doc", "barfoo");
-
-       if (docsLoaded == 1) {
-          setUpPageStatus = 'complete';
-       }
-    } catch(ex) {
-        catchInitializationError(builder, ex);
-        setUpPageStatus = 'complete';
-    }
-}
-
-//
-//   This method is called on the completion of
-//      each asychronous load started in setUpTests.
-//
-//   When every synchronous loaded document has completed,
-//      the page status is changed which allows the
-//      body of the test to be executed.
-function loadComplete() {
-    if (++docsLoaded == 1) {
-        setUpPageStatus = 'complete';
-    }
-}
-
-/**
-*
-    The setDocmentURI method set the location of the document.
-
-    Create a new document and set its documentURI to a valid string.  Retrieve the documentURI
-    and verify if it is was correctly set.
-
-* @author IBM
-* @author Neil Delima
-* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Document3-documentURI
-*/
-function documentsetdocumenturi03() {
-   var success;
-    if(checkInitialization(builder, "documentsetdocumenturi03") != null) return;
-    var doc;
-      var newDoc;
-      var domImpl;
-      var docURI;
-      var nullDocType = null;
-
-      var docElem;
-      var rootNS;
-      var rootName;
-
-      var docRef = null;
-      if (typeof(this.doc) != 'undefined') {
-        docRef = this.doc;
-      }
-      doc = load(docRef, "doc", "barfoo");
-      docElem = doc.documentElement;
-
-      rootNS = docElem.namespaceURI;
-
-      rootName = docElem.tagName;
-
-      domImpl = doc.implementation;
-newDoc = domImpl.createDocument(rootNS,rootName,nullDocType);
-      newDoc.documentURI = "somestring";
-
-      docURI = newDoc.documentURI;
-
-      assertEquals("documentsetdocumenturi03","somestring",docURI);
-
-}
-
-function runTest() {
-   documentsetdocumenturi03();
-}
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.xhtml b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.xhtml
deleted file mode 100644
index 1bb2f2c..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.xhtml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html [
-<!ENTITY ent1 'foo'>
-<!ENTITY ent2 'foo<br/>'>
-<!ELEMENT html (head, body)>
-<!ATTLIST html xmlns CDATA #IMPLIED>
-<!ELEMENT head (title,script*)>
-<!ELEMENT script (#PCDATA)>
-<!ATTLIST script 
-     src CDATA #IMPLIED
-     type CDATA #IMPLIED
-     charset CDATA #IMPLIED>
-<!ELEMENT title (#PCDATA)>
-<!ELEMENT body (p)>
-<!ATTLIST body onload CDATA #IMPLIED>
-<!ELEMENT p (#PCDATA|br)*>
-<!ELEMENT br EMPTY>
-]>
-<html xmlns='http://www.w3.org/1999/xhtml'>
-<head>
-<title>replaceWholeText sample</title>
-<script type='text/javascript' src='selfxhtml.js'></script><script charset='UTF-8' type='text/javascript' src='documentsetdocumenturi03.js'></script><script type='text/javascript'>function loadComplete() { startTest(); }</script></head>
-<body onload="loadComplete()">
-<p>bar</p>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02-expected.txt b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02-expected.txt
deleted file mode 100644
index 65f196b..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Test	http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodegetbaseuri02
-Status	error
-Message	Line undefined: TypeError
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.js b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.js
deleted file mode 100644
index 2574da2..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
-Copyright © 2001-2004 World Wide Web Consortium,
-(Massachusetts Institute of Technology, European Research Consortium
-for Informatics and Mathematics, Keio University). All
-Rights Reserved. This work is distributed under the W3C® Software License [1] in the
-hope that it will be useful, but WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
-*/
-
-   /**
-    *  Gets URI that identifies the test.
-    *  @return uri identifier of test
-    */
-function getTargetURI() {
-      return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodegetbaseuri02";
-   }
-
-var docsLoaded = -1000000;
-var builder = null;
-
-//
-//   This function is called by the testing framework before
-//      running the test suite.
-//
-//   If there are no configuration exceptions, asynchronous
-//        document loading is started.  Otherwise, the status
-//        is set to complete and the exception is immediately
-//        raised when entering the body of the test.
-//
-function setUpPage() {
-   setUpPageStatus = 'running';
-   try {
-     //
-     //   creates test document builder, may throw exception
-     //
-     builder = createConfiguredBuilder();
-
-      docsLoaded = 0;
-
-      var docRef = null;
-      if (typeof(this.doc) != 'undefined') {
-        docRef = this.doc;
-      }
-      docsLoaded += preload(docRef, "doc", "barfoo");
-
-       if (docsLoaded == 1) {
-          setUpPageStatus = 'complete';
-       }
-    } catch(ex) {
-        catchInitializationError(builder, ex);
-        setUpPageStatus = 'complete';
-    }
-}
-
-//
-//   This method is called on the completion of
-//      each asychronous load started in setUpTests.
-//
-//   When every synchronous loaded document has completed,
-//      the page status is changed which allows the
-//      body of the test to be executed.
-function loadComplete() {
-    if (++docsLoaded == 1) {
-        setUpPageStatus = 'complete';
-    }
-}
-
-/**
-*
-    Using getBaseURI check if the baseURI attribute of a new Document node is null
-    and if affected by changes in Document.documentURI.
-
-* @author IBM
-* @author Neil Delima
-* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Node3-baseURI
-* @see http://www.w3.org/Bugs/Public/show_bug.cgi?id=419
-* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/infoset-mapping#Infoset2Document
-*/
-function nodegetbaseuri02() {
-   var success;
-    if(checkInitialization(builder, "nodegetbaseuri02") != null) return;
-    var doc;
-      var newDoc;
-      var domImpl;
-      var baseURI;
-      var rootNS;
-      var rootName;
-      var docElem;
-      var nullDocType = null;
-
-      var docRef = null;
-      if (typeof(this.doc) != 'undefined') {
-        docRef = this.doc;
-      }
-      doc = load(docRef, "doc", "barfoo");
-      docElem = doc.documentElement;
-
-      rootNS = docElem.namespaceURI;
-
-      rootName = docElem.tagName;
-
-      domImpl = doc.implementation;
-newDoc = domImpl.createDocument(rootNS,rootName,nullDocType);
-      baseURI = newDoc.baseURI;
-
-      assertNull("baseURIIsNull",baseURI);
-    newDoc.documentURI = "http://www.example.com/sample.xml";
-
-      baseURI = newDoc.baseURI;
-
-      assertEquals("baseURISameAsDocURI","http://www.example.com/sample.xml".toLowerCase(),baseURI.toLowerCase());
-
-}
-
-function runTest() {
-   nodegetbaseuri02();
-}
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.xhtml b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.xhtml
deleted file mode 100644
index 8cd4f20..0000000
--- a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.xhtml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html [
-<!ENTITY ent1 'foo'>
-<!ENTITY ent2 'foo<br/>'>
-<!ELEMENT html (head, body)>
-<!ATTLIST html xmlns CDATA #IMPLIED>
-<!ELEMENT head (title,script*)>
-<!ELEMENT script (#PCDATA)>
-<!ATTLIST script 
-     src CDATA #IMPLIED
-     type CDATA #IMPLIED
-     charset CDATA #IMPLIED>
-<!ELEMENT title (#PCDATA)>
-<!ELEMENT body (p)>
-<!ATTLIST body onload CDATA #IMPLIED>
-<!ELEMENT p (#PCDATA|br)*>
-<!ELEMENT br EMPTY>
-]>
-<html xmlns='http://www.w3.org/1999/xhtml'>
-<head>
-<title>replaceWholeText sample</title>
-<script type='text/javascript' src='selfxhtml.js'></script><script charset='UTF-8' type='text/javascript' src='nodegetbaseuri02.js'></script><script type='text/javascript'>function loadComplete() { startTest(); }</script></head>
-<body onload="loadComplete()">
-<p>bar</p>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-mac-expected.txt b/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-mac-expected.txt
deleted file mode 100644
index a0fa35a..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-mac-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-Extending by character
-Test 1, LTR:
-  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5)], "ipsum dolor sit"[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amett"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending left:  " amett"[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)], "Lorem "[(0,5), (0,4), (0,3), (0,2), (0,1)]
-
-
-
-
-
-Extending by word
-Test 1, LTR:
-  Extending right: "Lorem "[(0,0), (0,5)], "ipsum dolor sit"[(0,5), (0,11), (0,15)], " amett"[(0,6), (0,1)]
-  Extending left:  " amett"[(0,6), (0,1)], "ipsum dolor sit"[(0,12), (0,6), (0,0)], "Lorem "[(0,0), (0,5)]
-
diff --git a/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-mac.html b/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-mac.html
deleted file mode 100644
index afc10e0a..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-mac.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<link rel="stylesheet" type="text/css" href="resources/extend-selection.css" />
-<script src="resources/extend-selection.js"></script>
-</head>
-<body>
-<pre id="console"></pre>
-<script>
-if (window.internals)
-    internals.settings.setEditingBehavior("mac");
-
-function runSelectionTestsWithGranularityForEnclosingBlock(testNodes, granularity)
-{
-    for (var i = 0; i < testNodes.length; ++i) {
-        getSelection().collapse(testNodes[i], 0);
-
-        log("Test " + (i + 1) + ", LTR:\n");
-        log("  Extending right: ");
-        extendAndLogSelectionWithinBlock("right", granularity, "mac");
-
-        log("  Extending left:  ");
-        extendAndLogSelectionWithinBlock("left", granularity, "mac");
-    }
-}
-
-log("\n\n\nExtending by character\n");
-runSelectionTestsWithGranularityForEnclosingBlock(createEnclosingBlockNodes(), "character");
-
-log("\n\n\n\n\nExtending by word\n");
-runSelectionTestsWithGranularityForEnclosingBlock(createEnclosingBlockNodes(), "word");
-</script>
-</body>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-win-expected.txt b/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-win-expected.txt
deleted file mode 100644
index 3a688b4..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-win-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-Extending by character
-Test 1, LTR:
-  Extending right: "Lorem "[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5)], "ipsum dolor sit"[(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13), (0,14), (0,15)], " amett"[(0,1), (0,2), (0,3), (0,4), (0,5)]
-  Extending left:  " amett"[(0,6), (0,5), (0,4), (0,3), (0,2), (0,1)], "ipsum dolor sit"[(0,15), (0,14), (0,13), (0,12), (0,11), (0,10), (0,9), (0,8), (0,7), (0,6), (0,5), (0,4), (0,3), (0,2), (0,1), (0,0)], "Lorem "[(0,5), (0,4), (0,3), (0,2), (0,1)]
-
-
-
-
-
-Extending by word
-Test 1, LTR:
-  Extending right: "Lorem "[(0,0)], "ipsum dolor sit"[(0,0), (0,6), (0,12)], " amett"[(0,1), (0,6)]
-  Extending left:  " amett"[(0,6), (0,1)], "ipsum dolor sit"[(0,12), (0,6), (0,0)]
-
diff --git a/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-win.html b/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-win.html
deleted file mode 100644
index 1991028..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/extend-selection-enclosing-block-win.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<link rel="stylesheet" type="text/css" href="resources/extend-selection.css" />
-<script src="resources/extend-selection.js"></script>
-</head>
-<body>
-<pre id="console"></pre>
-<script>
-function runSelectionTestsWithGranularityForEnclosingBlock(testNodes, granularity)
-{
-    for (var i = 0; i < testNodes.length; ++i) {
-        getSelection().collapse(testNodes[i], 0);
-
-        log("Test " + (i + 1) + ", LTR:\n");
-        log("  Extending right: ");
-        extendAndLogSelectionWithinBlock("right", granularity, "win");
-
-        log("  Extending left:  ");
-        extendAndLogSelectionWithinBlock("left", granularity, "win");
-    }
-}
-
-if (window.internals)
-    internals.settings.setEditingBehavior("win");
-log("\n\n\nExtending by character\n");
-runSelectionTestsWithGranularityForEnclosingBlock(createEnclosingBlockNodes(), "character");
-
-log("\n\n\n\n\nExtending by word\n");
-runSelectionTestsWithGranularityForEnclosingBlock(createEnclosingBlockNodes(), "word");
-</script>
-</body>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_by_word_002.html b/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_by_word_002.html
index c267b56..301741f 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_by_word_002.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_by_word_002.html
@@ -29,12 +29,7 @@
           `<li>${middot} <a href="foo.html">Soups & Salads</a></li>`,
           `<li>${middot} <a href="foo.html">Sandwiches & Burgers</a></li>`,
           isMac ? `<li>${middot} <a href="foo.html">Steak| & Ribs</a></li>`
-                // The current non-Mac behavior is wrong. The correct focus
-                // should be at 'Steak & |Ribs'. A deeper reason is that Blink
-                // performs backward word boundary searches to refine the final
-                // selection, which doesn't work with first-letter
-                // (crbug.com/671104).
-                : `<li>${middot} <a href="foo.html">Steak &| Ribs</a></li>`,
+                : `<li>${middot} <a href="foo.html">Steak |& Ribs</a></li>`,
           `<li>${middot} <a href="foo.html">Seafood</a></li>`,
           `<li>${middot} <a href="foo.html">Combos</a></li>`,
         '</ul>'
diff --git a/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_selection_enclosing_block.html b/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_selection_enclosing_block.html
new file mode 100644
index 0000000..1a3a70a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_selection_enclosing_block.html
@@ -0,0 +1,90 @@
+<!doctype HTML>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script src="../../assert_selection.js"></script>
+<script>
+const kAllPlatforms = ['android', 'mac', 'unix', 'win'];
+const platforms = window.internals
+    ? kAllPlatforms
+    : [navigator.platform.indexOf('Win') === 0 ? 'win' : navigator.platform];
+for (const platform of platforms) {
+  if (window.internals)
+    internals.settings.setEditingBehavior(platform);
+  const isWin = platform === 'win';
+
+  // TDOO(editing-dev): All of expectations are different from Firefox, we
+  // should study differences.
+
+  // TODO(editing-dev): As of [1], Blink paints caret in wrong position for
+  // Latin alphabet in RTL.
+  // For "def ghi"  offset 0 paints caret after "ghi",
+  // For "def ghi"  offset 7 paints caret before "def".
+  // See [2] for manual checking.
+  // [1] http://crbug.com/702049 Ctrl+Right from LTR to RTL makes infinite loop
+  // [2] https://jsfiddle.net/3pykkjzd/
+
+  // Extend left character
+  test(() => {
+    assert_selection(
+      '<div contenteditable>abc <div dir="rtl">|def ghi</div> jkl</div>',
+      selection => selection.modify('extend', 'left', 'character'),
+      '<div contenteditable>abc <div dir="rtl">^d|ef ghi</div> jkl</div>');
+  }, `${platform}: extend character left: ltr <- rtl`);
+
+  test(() => {
+    assert_selection(
+      '<div contenteditable>abc <div dir="rtl">def ghi</div> |jkl</div>',
+      selection => selection.modify('extend', 'left', 'character'),
+      '<div contenteditable>abc <div dir="rtl">def ghi|</div>^ jkl</div>');
+  }, `${platform}: extend character left: rtl <- ltr`);
+
+  // Extend left word
+  test(() => {
+    assert_selection(
+      '<div contenteditable>abc <div dir="rtl">|def ghi</div> jkl</div>',
+      selection => selection.modify('extend', 'left', 'word'),
+      isWin
+        ? '<div contenteditable>abc <div dir="rtl">^def |ghi</div> jkl</div>'
+        : '<div contenteditable>abc <div dir="rtl">^def| ghi</div> jkl</div>');
+  }, `${platform}: extend word left: ltr <- rtl`);
+
+  test(() => {
+    assert_selection(
+      '<div contenteditable>abc <div dir="rtl">def ghi</div> |jkl</div>',
+      selection => selection.modify('extend', 'left', 'word'),
+      '<div contenteditable>abc <div dir="rtl">def |ghi</div>^ jkl</div>');
+  }, `${platform}: extend word left: rtl <- ltr`);
+
+  // Extend right character
+  test(() => {
+    assert_selection(
+      '<div contenteditable>abc |<div dir="rtl">def ghi</div> jkl</div>',
+      selection => selection.modify('extend', 'right', 'character'),
+      '<div contenteditable>abc ^<div dir="rtl">|def ghi</div> jkl</div>');
+  }, `${platform}: extend character right: ltr -> rtl`);
+
+  test(() => {
+    assert_selection(
+      '<div contenteditable>abc <div dir="rtl">def ghi|</div> jkl</div>',
+      selection => selection.modify('extend', 'right', 'character'),
+      '<div contenteditable>abc <div dir="rtl">def gh|i^</div> jkl</div>');
+  }, `${platform}: extend character right: rtl -> ltr`);
+
+  // Extend right word
+  test(() => {
+    assert_selection(
+      '<div contenteditable>abc |<div dir="rtl">def ghi</div> jkl</div>',
+      selection => selection.modify('extend', 'right', 'word'),
+      isWin
+         ? '<div contenteditable>abc ^<div dir="rtl">def |ghi</div> jkl</div>'
+         : '<div contenteditable>abc ^<div dir="rtl">def| ghi</div> jkl</div>');
+  }, `${platform}: extend word right: ltr -> rtl`);
+
+  test(() => {
+    assert_selection(
+      '<div contenteditable>abc <div dir="rtl">def ghi|</div> jkl</div>',
+      selection => selection.modify('extend', 'right', 'word'),
+      '<div contenteditable>abc <div dir="rtl">def |ghi^</div> jkl</div>');
+  }, `${platform}: extend word right: rtr -> ltr`);
+}
+</script>
diff --git a/third_party/WebKit/LayoutTests/editing/text-iterator/first-letter-word-boundary.html b/third_party/WebKit/LayoutTests/editing/text-iterator/first-letter-word-boundary.html
index 419262b..a9a13781 100644
--- a/third_party/WebKit/LayoutTests/editing/text-iterator/first-letter-word-boundary.html
+++ b/third_party/WebKit/LayoutTests/editing/text-iterator/first-letter-word-boundary.html
@@ -15,11 +15,7 @@
     [
       '<style>:first-letter{color:red;}</style>',
       isMac ? '<div contenteditable> hello| world\'</div>'
-            // The current non-Mac behavior is wrong. The correct expectation
-            // should be 'hello |world'. A deeper reason is that Blink performs
-            // backward word boundary searches to refine the final selection,
-            // which doesn't work with first-letter (crbug.com/671104).
-            : '<div contenteditable> hell|o world\'</div>'
+            : '<div contenteditable> hello |world\'</div>'
     ].join('')), 'Move forward by word');
 
 test(() => assert_selection(
@@ -42,11 +38,7 @@
     [
       '<style>:first-letter{color:red;}</style>',
       isMac ? '<div contenteditable style="white-space:pre"> hello| world\'</div>'
-            // The current non-Mac behavior is wrong. The correct expectation
-            // should be 'hello |world'. A deeper reason is that Blink performs
-            // backward word boundary searches to refine the final selection,
-            // which doesn't work with first-letter (crbug.com/671104).
-            : '<div contenteditable style="white-space:pre"> hell|o world\'</div>'
+            : '<div contenteditable style="white-space:pre"> hello |world\'</div>'
     ].join('')), 'Move forward by word with white-space:pre');
 
 test(() => assert_selection(
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-001.xht
index 970c8ce3..c6f165f7 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-001.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Regular and anonymous grid items within an inline grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4 Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <meta name="assert" content="Checks that inline grid container children become grid items, and text that is directly contained inside the inline grid is wrapped in an anonymous grid item." />
         <style type="text/css"><![CDATA[
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-002.xht
index d914bc69..4403406 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-002.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Children of grid items do not create new items within an inline grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4 Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <meta name="assert" content="Checks that the grid items do not split around blocks creating extra items within an inline grid." />
         <style type="text/css"><![CDATA[
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-003.xht
index 1afc346..87eea10 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-003.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Grid items with 'display:none' are not rendered within an inline grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4 Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-inline-blocks-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-inline-blocks-001.xht
index d545ccc9..c65115eb 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-inline-blocks-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-items-inline-blocks-001.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="9.5 Z-axis Ordering: the z-index property" />
         <link rel="help" href="http://www.w3.org/TR/CSS2/zindex.html#painting-order" title="E.2 Painting order" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <style type="text/css"><![CDATA[
             #inline-grid {
                 display: inline-grid;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-001.xht
index cad88f50..c6e49963 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-001.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-002.xht
index 52354d1..1a03fb6 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-002.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-003.xht
index 3d76994..b336e219 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-003.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-004.xht
index ba595a13..187e150 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-004.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-005.xht
index cc4c7a52..c49e388 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-order-property-painting-005.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-001.xht
index 6780d54..03c343bb 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-001.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items within an inline grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-002.xht
index 4b396bc2..cadc1a13 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-002.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items within an inline grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-003.xht
index bb340c4..84339d7 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-003.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items within an inline grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-004.xht
index a32b271..a61bd8d5 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-004.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items within an inline grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-005.xht
index c179705..a859b791 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-inline-z-axis-ordering-005.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items within an inline grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #inline-grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-001.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-001.html
index e6274e6c..1dca0dc 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-001.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-001.html
@@ -4,7 +4,7 @@
 <link rel="author" title="Tomek Wytrebowicz" href="mailto:tomalecpub@gmail.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4. Grid Items">
 <meta name="assert" content="A grid item is sized within the containing block defined by its grid area">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <style>
     #grid {
         display: grid;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-002.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-002.html
index 11c9415..664e069 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-002.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-002.html
@@ -4,7 +4,7 @@
 <link rel="author" title="Tomek Wytrebowicz" href="mailto:tomalecpub@gmail.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4. Grid Items">
 <meta name="assert" content="A grid item is sized within the containing block defined by its grid area">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <style>
     #grid {
         display: grid;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-003.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-003.html
index 63adea88..0194f3cf 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-003.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-003.html
@@ -4,7 +4,7 @@
 <link rel="author" title="Tomek Wytrebowicz" href="mailto:tomalecpub@gmail.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4. Grid Items">
 <meta name="assert" content="A grid item is sized within the containing block defined by its grid area">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <style>
     #grid {
         display: grid;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-004.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-004.html
index 3734612..b36fbb2 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-004.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-item-containing-block-004.html
@@ -4,7 +4,7 @@
 <link rel="author" title="Tomek Wytrebowicz" href="mailto:tomalecpub@gmail.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4. Grid Items">
 <meta name="assert" content="A grid item is sized within the containing block defined by its grid area that intersects flexible tracks">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <style>
     #grid {
         display: grid;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-001.xht
index be479ed9..7cacd22 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-001.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Regular and anonymous grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4 Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <meta name="assert" content="Checks that grid container children become grid items, and text that is directly contained inside the grid is wrapped in an anonymous grid item." />
         <style type="text/css"><![CDATA[
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-002.xht
index 392a363..19e86b6 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-002.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Children of grid items do not create new items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4 Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <meta name="assert" content="Checks that the grid items do not split around blocks creating extra items." />
         <style type="text/css"><![CDATA[
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-003.xht
index e288f317..a9bdff25 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-003.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Grid items with 'display:none' are not rendered</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="4 Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-inline-blocks-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-inline-blocks-001.xht
index 416192e..90c7520 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-inline-blocks-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-items-inline-blocks-001.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="9.5 Z-axis Ordering: the z-index property" />
         <link rel="help" href="http://www.w3.org/TR/CSS2/zindex.html#painting-order" title="E.2 Painting order" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <style type="text/css"><![CDATA[
             #grid {
                 display: grid;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-001.xht
index a5ae3c5..b625c9f 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-001.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Minimum size of grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.6. Implied Minimum Size of Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <meta name="assert" content="Checks that minimum size for grid items is the content size." />
         <style type="text/css"><![CDATA[
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-002.xht
index 3a2daa0..1adb1a60 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-002.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Minimum size of grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.6. Implied Minimum Size of Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="assert" content="Checks that minimum size for grid items is the content size." />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-003.xht
index 06a1fda..0e198e0e 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-003.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Minimum size of grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.6. Implied Minimum Size of Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="assert" content="Checks that minimum size for grid items is the specified size regardless of the content size." />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-004.xht
index 82e395da..683dd64 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-004.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: Minimum size of grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.6. Implied Minimum Size of Grid Items" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="assert" content="Checks that minimum size for grid items is the specified size regardless of the content size." />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-010.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-010.html
index af8aa3a0..a2406a5 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-010.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-010.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size gets clamped, so the grid item doesn't overflow the fixed size area.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-011.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-011.html
index cf6d987..d769cdee 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-011.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-011.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size gets clamped, so the grid item doesn't overflow the fixed size area.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-012.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-012.html
index 87c4a0cc..2a39c9b 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-012.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-012.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size gets clamped, so the grid item doesn't overflow the fixed size area.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-013.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-013.html
index fa91dff..85e18cdf 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-013.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-013.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="flags" content="ahem">
 <meta name="assert" content="Checks that automatic minimum size is not clamped if the grid item has not stretch alignment.">
 <style>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-014.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-014.html
index 84f211cc..09e3fd5 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-014.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-014.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size is not clamped if the grid item has not stretch alignment.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-015.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-015.html
index 9ead760..0d36aaa 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-015.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-015.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size is not clamped if the grid item if it spans some not fixed grid tracks.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-016.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-016.html
index f992bfbc..26a3572 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-016.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-016.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size is clamped if the grid item only spans fixed grid tracks.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-017.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-017.html
index 63302a2..6cd2dfb 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-017.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-017.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size is not clamped if the track has an 'auto' min track sizing function.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-018.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-018.html
index 4cd947e1..df9d502 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-018.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-018.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size is not clamped if the track has an 'auto' min track sizing function.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-019.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-019.html
index af8fe00..ae18e613 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-019.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-019.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size gets clamped, so the grid item doesn't overflow the fixed size area.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-020.html b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-020.html
index d83f473..2e8b473 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-020.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-minimum-size-grid-items-020.html
@@ -3,7 +3,7 @@
 <title>CSS Grid Layout Test: Minimum size of grid items</title>
 <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
 <link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.5. Implied Minimum Size of Grid Items">
-<link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
 <meta name="assert" content="Checks that automatic minimum size is clamped if the grid item only spans fixed grid tracks.">
 <style>
 #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-001.xht
index 255c07d..0764753 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-001.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-002.xht
index 9763c37c..634274a 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-002.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-003.xht
index 43ddc28..3655849 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-003.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-004.xht
index 96f2dda6..0831f1fc 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-004.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-005.xht
index 191ddf3..75941e6 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-order-property-painting-005.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#order-property" title="4.2 Reordered Grid Items: the order property" />
         <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property" title="5.4. Display Order: the order property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-001.xht
index 6cefa441..cbabf8ef 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-001.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-002.xht
index 9b79817..00d3c02 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-002.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-003.xht
index 11ac1d70..12eae135 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-003.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-004.xht
index f89df1c..04e3f06 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-004.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-005.xht
index 086100af..31c6756 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-items/grid-z-axis-ordering-005.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: 'z-index' property controls the z-axis order of grid items</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#z-order" title="4.4. Z-axis Ordering: the z-index property" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #grid {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-display-grid-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-display-grid-001.xht
index 5c8de21..761b0ef 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-display-grid-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-display-grid-001.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2014-11-18 -->
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <meta name="assert" content="This test checks that 'grid' value for 'display' property generates a block level containing box." />
         <style type="text/css"><![CDATA[
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-display-inline-grid-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-display-inline-grid-001.xht
index fef9e86..ea708fe 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-display-inline-grid-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-display-inline-grid-001.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2014-11-18 -->
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="assert" content="This test checks that 'inline-grid' value for 'display' property generates an inline level containing box." />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-float-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-float-001.xht
index d0dc708..e56fda91 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-float-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-float-001.xht
@@ -6,7 +6,7 @@
         <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-01-03 -->
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
         <link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#float-position" title="9.5.1 Positioning the float" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
                 position: absolute;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-floats-no-intrude-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-floats-no-intrude-001.xht
index 49f779c..6f61edf4 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-floats-no-intrude-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-floats-no-intrude-001.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: floats do not intrude into a grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
                 position: absolute;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-float-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-float-001.xht
index a9389dc..04a530fe 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-float-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-float-001.xht
@@ -6,7 +6,7 @@
         <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-01-03 -->
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
         <link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#float-position" title="9.5.1 Positioning the float" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
                 position: absolute;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-floats-no-intrude-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-floats-no-intrude-001.xht
index 015012e..7520c94 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-floats-no-intrude-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-floats-no-intrude-001.xht
@@ -4,7 +4,7 @@
         <title>CSS Grid Layout Test: floats do not intrude into an inline grid</title>
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
                 position: absolute;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-multicol-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-multicol-001.xht
index 4eba9c9..be27a53b 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-multicol-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-multicol-001.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
         <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns" title="3. The number and width of columns" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="assert" content="This test checks that 'column-*' properties in the Multicol module are ignored in grid items when applied to an inline grid container." />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-vertical-align-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-vertical-align-001.xht
index 4e4ca35..e7d0dfc0 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-vertical-align-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-inline-vertical-align-001.xht
@@ -6,7 +6,7 @@
         <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2014-12-10 -->
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
         <link rel="help" href="http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align" title="10.8.1 Leading and half-leading" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-multicol-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-multicol-001.xht
index 7612731..466033c5 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-multicol-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-multicol-001.xht
@@ -5,7 +5,7 @@
         <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
         <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns" title="3. The number and width of columns" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="assert" content="This test checks that 'column-*' properties in the Multicol module are ignored in grid items when applied to a grid container." />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-vertical-align-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-vertical-align-001.xht
index dd382b0..36c39cd3 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-vertical-align-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-grid-1/grid-model/grid-vertical-align-001.xht
@@ -6,7 +6,7 @@
         <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2014-12-10 -->
         <link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers" title="3.1 Establishing Grid Containers" />
         <link rel="help" href="http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align" title="10.8.1 Leading and half-leading" />
-        <link rel="match" href="../../css21/reference/ref-filled-green-100px-square.xht" />
+        <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
         <meta name="flags" content="ahem" />
         <style type="text/css"><![CDATA[
             #reference-overlapped-red {
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-003.xht
index 9e9e88d..ad310d10 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-003.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'ltr', then an absolutely positioned box (with 'left: auto', 'width: auto' and 'right: auto') whose containing block is the initial containing block must set 'left' to the static position. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-007.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-007.xht
index 172b674..2bcea77 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-007.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-007.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'ltr', then an absolutely positioned box (with 'left' and 'width' are 'auto' and 'right' is not 'auto') whose containing block is the initial containing block must set width to shrink-to-fit and then solve for 'left'. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
@@ -43,4 +43,4 @@
   <div id="red-overlapped-reference"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-011.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-011.xht
index ae73fc1d..f37db8d 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-011.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-011.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'ltr', then an absolutely positioned box (with 'left' and 'right' are 'auto' and 'width' is not 'auto') whose containing block is the initial containing block and whose direction is 'ltr' must set left to static position and then solve for 'right'. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
@@ -102,4 +102,4 @@
   <div id="red-overlapped-reference"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-019.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-019.xht
index 83f98edd..0a0886f 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-019.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-019.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'ltr', then an absolutely positioned box (with 'left' is 'auto', 'width' and 'right' are not 'auto') whose containing block is the initial containing block must solve for 'left'. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
@@ -43,4 +43,4 @@
   <div id="red-overlapped-reference"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-021.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-021.xht
index 515c258c..f359a844 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-021.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vlr-021.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'rtl', then an absolutely positioned box (with 'left' is 'auto', 'width' and 'right' are not 'auto') whose containing block is the initial containing block must solve for 'left'. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
@@ -43,4 +43,4 @@
   <div id="red-overlapped-reference"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-002.xht
index 953b22dd..6849449 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-002.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'ltr', then an absolutely positioned box (with 'left: auto', 'width: auto' and 'right: auto') whose containing block is the initial containing block must set 'left' to the static position. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
@@ -103,4 +103,4 @@
   <div id="red-overlapped-reference"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-006.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-006.xht
index bbcfe2e..8161e71 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-006.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-006.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'ltr', then an absolutely positioned box (with 'left' and 'width' are 'auto' and 'right' is not 'auto') whose containing block is the initial containing block must set width to shrink-to-fit and then solve for 'left'. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
@@ -43,4 +43,4 @@
   <div id="red-overlapped-reference"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-010.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-010.xht
index e003644..81f48c5 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-010.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-010.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'ltr', then an absolutely positioned box (with 'left' and 'right' are 'auto', 'width' is not 'auto') whose containing block is the initial containing block and whose direction is 'ltr' must set left to static position and then solve for 'right'. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
@@ -102,4 +102,4 @@
   <div id="red-overlapped-reference"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-018.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-018.xht
index b59353d3..bf6fac43e 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-018.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-018.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'ltr', then an absolutely positioned box (with 'left' is 'auto', 'width' and 'right' are not 'auto') whose containing block is the initial containing block must solve for 'left'. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
@@ -43,4 +43,4 @@
   <div id="red-overlapped-reference"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-020.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-020.xht
index 983e0ae3..7d0a3ad9 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-020.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/abs-pos-non-replaced-icb-vrl-020.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that when the initial containing block's writing-mode is 'horizontal-tb' and its 'direction' is 'rtl', then an absolutely positioned box (with 'left' is 'auto', 'width' and 'right' are not 'auto') whose containing block is the initial containing block must solve for 'left'. Whether such absolutely positioned box's 'writing-mode' is vertical or not is irrelevant." name="assert" />
@@ -43,4 +43,4 @@
   <div id="red-overlapped-reference"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-002.xht
index 811e581..20ff8c6a 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-002.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#replaced-baselines" title="4.3 Atomic Inline Baselines" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that the baseline-alignment of an empty inline-block box in the line box with 'writing-mode' set to 'vertical-rl' is 'central' and not 'alphabetic'." name="assert" />
@@ -42,4 +42,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-003.xht
index 6dcc4df..79aeb04 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-003.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#replaced-baselines" title="4.3 Atomic Inline Baselines" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that the baseline-alignment of an empty inline-block box in the line box with 'writing-mode' set to 'vertical-rl' is 'central' and not 'alphabetic'." name="assert" />
@@ -42,4 +42,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-004.xht
index f2f5d016e..32aca310 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-004.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#replaced-baselines" title="4.3 Atomic Inline Baselines" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that the baseline-alignment of a non-empty inline-block box in the line box with 'writing-mode' set to 'vertical-rl' is 'central' and not 'alphabetic'." name="assert" />
@@ -40,4 +40,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-005.xht
index 0f281c9..a0bc226 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/baseline-inline-non-replaced-005.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#replaced-baselines" title="4.3 Atomic Inline Baselines" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that the baseline-alignment of a non-empty inline-block box in the line box with 'writing-mode' set to 'vertical-rl' is 'central' and not 'alphabetic'." name="assert" />
@@ -40,4 +40,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-003.xht
index bd685e4..9efcd25 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-003.xht
@@ -9,7 +9,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -66,4 +66,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-005.xht
index d9795ca4..893113b 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-005.xht
@@ -9,7 +9,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -66,4 +66,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-007.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-007.xht
index a95e665..2c2f4a2 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-007.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-007.xht
@@ -14,7 +14,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -148,4 +148,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-009.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-009.xht
index f73cc89..7e66cfd3 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-009.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-009.xht
@@ -14,7 +14,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -149,4 +149,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-011.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-011.xht
index d0dfec83..79973e6 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-011.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-011.xht
@@ -9,7 +9,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -143,4 +143,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-013.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-013.xht
index 04c05dd..415995a 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-013.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vlr-013.xht
@@ -9,7 +9,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that, in border-collapsing model, when 'border-style' values and 'border-width' values are identical, then the 'border-color' set on a cell wins over the 'border-color' set on a row (5th table), the 'border-color' set on a cell wins over the 'border-color' set on a row group (tfoot in 4th table, thead in 3rd table, tbody in 2nd table) and the 'border-color' set on a cell wins over the 'border-color' set on a table element (1st table)." name="assert" />
@@ -184,4 +184,4 @@
   <div id="reference-overlapped-red"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-002.xht
index a322a56a..a0818271 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-002.xht
@@ -9,7 +9,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -66,4 +66,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-004.xht
index 69d01d1..e0e2200 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-004.xht
@@ -9,7 +9,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -66,4 +66,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-006.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-006.xht
index ae88491c..aa1f85c 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-006.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-006.xht
@@ -14,7 +14,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -148,4 +148,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-008.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-008.xht
index 63aa0f4a..badca8a 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-008.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-008.xht
@@ -14,7 +14,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -149,4 +149,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-010.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-010.xht
index f9efac17..e86242d 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-010.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-010.xht
@@ -9,7 +9,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="When two adjacent cells have the same 'border-width' value and the same 'border-style' value in a 'border-collapse: collapse' table, then the color of the border of the cell closest to line-left side wins (if the table's 'direction' is 'ltr'; line-right side, if it is 'rtl') and the color of the border of the cell closest to block-start side wins." name="assert" />
@@ -143,4 +143,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-012.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-012.xht
index ac2b22f..5fd041a8 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-012.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/border-conflict-element-vrl-012.xht
@@ -9,7 +9,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
   <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution" title="17.6.2.1 Border conflict resolution" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that, in border-collapsing model, when 'border-style' values and 'border-width' values are identical, then the 'border-color' set on a cell wins over the 'border-color' set on a row (5th table), the 'border-color' set on a cell wins over the 'border-color' set on a row group (tfoot in 4th table, thead in 3rd table, tbody in 2nd table) and the 'border-color' set on a cell wins over the 'border-color' set on a table element (1st table)." name="assert" />
@@ -184,4 +184,4 @@
   <div id="reference-overlapped-red"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vlr-003.xht
index 3b93101..fb7b9e1 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vlr-003.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#logical-direction-layout" title="7.4. Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that when 'caption-side' is set to 'top' in a vertical-lr table, then the caption is placed at the block-start side of the table, which is on the lefthand side of such table." name="assert" />
@@ -60,4 +60,4 @@
   <div id="reference-overlapped-red"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vlr-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vlr-005.xht
index 9ebaf51..cc8b56b 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vlr-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vlr-005.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#logical-direction-layout" title="7.4. Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that when 'caption-side' is set to 'bottom' in a vertical-lr table, then the caption is placed at the block-end side of the table, which is on the righthand side of such table." name="assert" />
@@ -59,4 +59,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vrl-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vrl-002.xht
index 540603d..90e90f1 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vrl-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vrl-002.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#logical-direction-layout" title="7.4. Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that when 'caption-side' is set to 'top' in a vertical-rl table, then the caption is placed at the block-start side of the table, which is on the righthand side of such table." name="assert" />
@@ -59,4 +59,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vrl-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vrl-004.xht
index 9f3693a..d83e8a64e 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vrl-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/caption-side-vrl-004.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#logical-direction-layout" title="7.4. Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that when 'caption-side' is set to 'bottom' in a vertical-rl table, then the caption is placed at the block-end side of the table, which is on the lefthand side of such table." name="assert" />
@@ -59,4 +59,4 @@
   </table>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-003.xht
index 2162319..377907ad 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-003.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that contiguous floated border-collapsing tables in a 'vertical-lr' context do not overlap." name="assert" />
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-005.xht
index 6820acb..032640a 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-005.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that contiguous floated non-border-collapsing tables in a 'vertical-lr' context do not overlap." name="assert" />
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-007.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-007.xht
index df3c81d3..34faf64 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-007.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-007.xht
@@ -13,7 +13,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="image" name="flags" />
   <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-lr' are not substracted by the amount of their borders. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-009.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-009.xht
index 08d130d..39fd43e0 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-009.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vlr-009.xht
@@ -13,7 +13,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="image" name="flags" />
   <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-lr' are not substracted by the amount of their horizontal padding. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-002.xht
index 60b48a2..0406d70 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-002.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that contiguous floated border-collapsing tables in a 'vertical-rl' context do not overlap." name="assert" />
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-004.xht
index f351da6..37f037ce2 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-004.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that contiguous floated non-border-collapsing tables in a 'vertical-rl' context do not overlap." name="assert" />
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-006.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-006.xht
index e4b8255..d973517 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-006.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-006.xht
@@ -13,7 +13,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="image" name="flags" />
   <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-rl' are not substracted by the amount of their borders. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-008.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-008.xht
index 37e04373..625f2c4 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-008.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/contiguous-floated-table-vrl-008.xht
@@ -13,7 +13,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="image" name="flags" />
   <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-rl' are not substracted by the amount of their horizontal padding. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/different-block-flow-dir-001.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/different-block-flow-dir-001.xht
index 6c43e1e..1df6039 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/different-block-flow-dir-001.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/different-block-flow-dir-001.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#writing-mode" title="3.1 Block Flow Direction: the writing-mode property" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that if an inline box has a different block flow direction than its containing block then its display computes to 'inline-block' in which case its specified width and specified height are not ignored and have to be rendered." name="assert" />
@@ -47,4 +47,4 @@
   <div id="reference-overlapped-red"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/different-block-flow-dir-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/different-block-flow-dir-002.xht
index caa9a529..93811d4 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/different-block-flow-dir-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/different-block-flow-dir-002.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#writing-mode" title="3.1 Block Flow Direction: the writing-mode property" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="" name="flags" />
   <meta content="This test checks that if an inline box has a different block flow direction than its containing block then its display computes to 'inline-block' in which case its specified width and specified height are not ignored and have to be rendered." name="assert" />
@@ -53,4 +53,4 @@
   <div id="reference-overlapped-red"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/direction-vlr-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/direction-vlr-005.xht
index 44c4699e..730bdda 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/direction-vlr-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/direction-vlr-005.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-directions" title="6.2 Flow-relative Directions" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that when a block box has 'direction' set to 'ltr' in a vertical writing-mode, then inlines boxes are aligned from line-left to line-right." name="assert" />
@@ -38,4 +38,4 @@
   <div>T</div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-003.xht
index 405a1e6..3392e65 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-003.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
 
@@ -47,4 +47,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-005.xht
index cfa8940..6391d8bd 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-005.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
 
@@ -47,4 +47,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-007.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-007.xht
index 654ffeb..9f4b5c8 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-007.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-007.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="image" name="flags" />
   <meta content="This test checks that a block container box which has floats will not extend its logical height (it will appear to not be aware of its floats) unless it has a clearing block. This test is important for CSS columnar layout page based on floats." name="assert" />
@@ -56,4 +56,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-009.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-009.xht
index 5e8fd54e..77ea726 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-009.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vlr-009.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="image" name="flags" />
   <meta content="This test checks that a block container box which has floats will not extend its logical height (it will appear to not be aware of its floats) unless it has a clearing block. This test is important for CSS columnar layout page based on floats." name="assert" />
@@ -63,4 +63,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-002.xht
index 89765ece7..ae7a939 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-002.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
 
@@ -47,4 +47,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-004.xht
index a163ca4..e550cb0d 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-004.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
 
@@ -47,4 +47,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-006.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-006.xht
index a6796b66..50541bf 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-006.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-006.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="image" name="flags" />
   <meta content="This test checks that a block container box which has floats will not extend its logical height (it will appear to not be aware of its floats) unless it has a clearing block. This test is important for CSS columnar layout page based on floats." name="assert" />
@@ -56,4 +56,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-008.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-008.xht
index dd23fe1..f1eb3e7 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-008.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-clear-vrl-008.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="image" name="flags" />
   <meta content="This test checks that a block container box which has floats will not extend its logical height (it will appear to not be aware of its floats) unless it has a clearing block. This test is important for CSS columnar layout page based on floats." name="assert" />
@@ -63,4 +63,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-contiguous-vlr-011.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-contiguous-vlr-011.xht
index f9b22d4..36c5003 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-contiguous-vlr-011.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-contiguous-vlr-011.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks the flow of contiguous left-floated boxes with 'writing-mode' set to 'vertical-lr'." name="assert" />
@@ -50,4 +50,4 @@
   <div class="floated-left">wxyzz</div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-contiguous-vrl-010.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-contiguous-vrl-010.xht
index a2c2c34..a650ce4 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-contiguous-vrl-010.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-contiguous-vrl-010.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks the flow of contiguous left-floated boxes with 'writing-mode' set to 'vertical-rl'." name="assert" />
@@ -50,4 +50,4 @@
   <div class="floated-left">wxyzz</div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-003.xht
index 32719aa..0cacf8e 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-003.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that 'shrink-to-fit' width is applied on logical width (measure)." name="assert" />
@@ -49,4 +49,4 @@
   <div id="reference-overlapped-green"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-005.xht
index 0b9f82c..5955f23 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-005.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that 'shrink-to-fit' width is applied on logical width (measure)." name="assert" />
@@ -54,4 +54,4 @@
   <div id="reference-overlapped-green"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-007.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-007.xht
index 2ff02e9..2416c16 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-007.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-007.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that 'shrink-to-fit' width is applied on logical width (measure)." name="assert" />
@@ -64,4 +64,4 @@
   <div id="reference-overlapped-green"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-009.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-009.xht
index ff77f66f..7c0e2df 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-009.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vlr-009.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that 'shrink-to-fit' applying on logical width must not reduce content but size to fit to its content. In this test, 'L' and 'R' glyphs must be rendered." name="assert" />
@@ -54,4 +54,4 @@
   <div id="reference-red-overlapped"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-002.xht
index c5a1723..bbf47f6b 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-002.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that 'shrink-to-fit' width is applied on logical width (measure)." name="assert" />
@@ -49,4 +49,4 @@
   <div id="reference-overlapped-green"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-004.xht
index 9a2614bf..f2dde89 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-004.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that 'shrink-to-fit' width is applied on logical width (measure)." name="assert" />
@@ -54,4 +54,4 @@
   <div id="reference-overlapped-green"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-006.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-006.xht
index 92741e9..3794dae 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-006.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-006.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that 'shrink-to-fit' width is applied on logical width (measure)." name="assert" />
@@ -64,4 +64,4 @@
   <div id="reference-overlapped-green"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-008.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-008.xht
index 44967acc..803863be 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-008.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-008.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that 'shrink-to-fit' applying on logical width must not reduce content but size to fit to its content. In this test, 'L' and 'R' glyphs must be rendered." name="assert" />
@@ -54,4 +54,4 @@
   <div id="reference-red-overlapped"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-vlr-016.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-vlr-016.xht
index 90136f8..133556d 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-vlr-016.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-shrink-to-fit-vrl-vlr-016.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that 'shrink-to-fit' rule (CSS2.1, §10.3.5) is applied onto logical width in vertical writing-modes. This test thoroughly checks systematically the 16 combinations of 'writing-mode: vertical-rl', 'writing-mode: vertical-lr', with 'float: left', with 'float: right' and with left and/or right border(s). Not tested here is 'padding-left' and 'padding-right'." name="assert" />
@@ -132,4 +132,4 @@
   <div id="reference-overlapped-green"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-003.xht
index 54a2dfc..9ca35074 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-003.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated right box in a containing block with 'writing-mode' set to 'vertical-lr' will be floated at the line-right side of its line box." name="assert" />
@@ -41,4 +41,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-005.xht
index a3406e6..0426bf80 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-005.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated right box in a containing block with 'writing-mode' set to 'vertical-lr' will be floated at the line-right side of its line box." name="assert" />
@@ -41,4 +41,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-007.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-007.xht
index c6e0de9..2f934c7 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-007.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-007.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated left box in a containing block with 'writing-mode' set to 'vertical-lr' will be floated at the line-left side of its line box." name="assert" />
@@ -41,4 +41,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-009.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-009.xht
index d42d232..99dd10dd 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-009.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-009.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated left box in a containing block with 'writing-mode' set to 'vertical-lr' will be floated at the line-left side of its line box." name="assert" />
@@ -41,4 +41,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-011.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-011.xht
index 61b6d7f..1f9a75e 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-011.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-011.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated left box and a floated right box in a containing block with 'writing-mode' set to 'vertical-lr' will be respectively floated at the line-left side of its line box and floated at line-right of its line box." name="assert" />
@@ -47,4 +47,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-013.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-013.xht
index ec66936..7a1550a 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-013.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vlr-013.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated left box and a floated right box in a containing block with 'writing-mode' set to 'vertical-lr' will be respectively floated at the line-left side of its line box and floated at line-right of its line box." name="assert" />
@@ -47,4 +47,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-002.xht
index 045aa72..1cb1d451 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-002.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated right box in a containing block with 'writing-mode' set to 'vertical-rl' will be floated at the line-right side of its line box." name="assert" />
@@ -41,4 +41,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-004.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-004.xht
index 87ec75e3..e1ae17f 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-004.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-004.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated right box in a containing block with 'writing-mode' set to 'vertical-rl' will be floated at the line-right side of its line box." name="assert" />
@@ -41,4 +41,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-006.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-006.xht
index e408787e..d998247 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-006.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-006.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated left box in a containing block with 'writing-mode' set to 'vertical-rl' will be floated at the line-left side of its line box." name="assert" />
@@ -41,4 +41,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-008.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-008.xht
index d59da59..7784a4a 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-008.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-008.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated left box in a containing block with 'writing-mode' set to 'vertical-rl' will be floated at the line-left side of its line box." name="assert" />
@@ -41,4 +41,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-010.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-010.xht
index 0aacdf9..039556a 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-010.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-010.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated left box and a floated right box in a containing block with 'writing-mode' set to 'vertical-rl' will be respectively floated at the line-left side of its line box and floated at line-right of its line box." name="assert" />
@@ -47,4 +47,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-012.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-012.xht
index 151331a..3e24ad63 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-012.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/float-vrl-012.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that a floated left box and a floated right box in a containing block with 'writing-mode' set to 'vertical-rl' will be respectively floated at the line-left side of its line box and floated at line-right of its line box." name="assert" />
@@ -47,4 +47,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/height-width-inline-non-replaced-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/height-width-inline-non-replaced-vlr-003.xht
index 2091a48a..9594e30 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/height-width-inline-non-replaced-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/height-width-inline-non-replaced-vlr-003.xht
@@ -10,7 +10,7 @@
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
   <link rel="help" href="http://www.w3.org/TR/2011/REC-CSS2-20110607/visudet.html#inline-width" title="10.3.1 Inline, non-replaced elements" />
   <link rel="help" href="http://www.w3.org/TR/2011/REC-CSS2-20110607/visudet.html#inline-non-replaced" title="10.6.1 Inline, non-replaced elements" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem" name="flags" />
   <meta content="This test checks that height and width declarations do not apply to inline non-replaced elements in vertical writing-modes." name="assert" />
@@ -55,4 +55,4 @@
   <div id="overlapping-green"></div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-003.xht
index b2e3592f1..d06226e 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-003.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -65,4 +65,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-009.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-009.xht
index 3a467c7..53e5dc3 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-009.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-009.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -65,4 +65,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-011.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-011.xht
index 96f898dc..6129ee39 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-011.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-011.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -66,4 +66,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-015.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-015.xht
index d231d9a..7ad780cb 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-015.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-015.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -67,4 +67,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-017.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-017.xht
index de53f3cd..6170b39 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-017.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-017.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted and modified from
@@ -65,4 +65,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-025.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-025.xht
index 768db30..fa65708 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-025.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-025.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -56,4 +56,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-031.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-031.xht
index 3d7d12bf..0959502 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-031.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-031.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta name="assert" content="This test checks that horizontal margins of boxes can collapse through a sibling box whose left and right margins collapse in 'vertical-lr' writing-mode." />
@@ -60,4 +60,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-035.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-035.xht
index 54928a9..0760bdc 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-035.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-035.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -63,4 +63,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-037.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-037.xht
index e9fe1c2..b08cbcc92 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-037.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vlr-037.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   "
@@ -67,4 +67,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-002.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-002.xht
index 69c370d..1752060 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-002.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-002.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -65,4 +65,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-008.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-008.xht
index abb1330..60ab06cc 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-008.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-008.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -65,4 +65,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-010.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-010.xht
index 2912ecf2..e5d9d35 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-010.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-010.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -66,4 +66,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-014.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-014.xht
index e4f3fdf..f6068e0 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-014.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-014.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -67,4 +67,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-016.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-016.xht
index 7cdfa243..4b2c948 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-016.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-016.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted and modified from
@@ -64,4 +64,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-024.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-024.xht
index 4ea84aeb..7685e48 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-024.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-024.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -56,4 +56,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-030.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-030.xht
index a2d196c..c520f5a 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-030.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-030.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta name="assert" content="This test checks that horizontal margins of boxes can collapse through a sibling box whose left and right margins collapse in 'vertical-rl' writing-mode." />
@@ -60,4 +60,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-034.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-034.xht
index e5814b3..40d0ce2 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-034.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-034.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   Test adapted from
@@ -63,4 +63,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-036.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-036.xht
index 6310819..eeb956f 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-036.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/margin-collapse-vrl-036.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#logical-direction-layout" title="7.4 Flow-Relative Mappings" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <!--
   "
@@ -67,4 +67,4 @@
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-003.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-003.xht
index bea78f3..ca54c29 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-003.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-003.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
 
@@ -38,4 +38,4 @@
   <div>T</div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-005.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-005.xht
index 2aae483..4acad851 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-005.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-005.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
   <meta content="This test checks that 'text-align: left' aligns an inline box within a line box with respect to the line box's logical left side (line-left side). Here, 'direction: rtl' has no impact, no influence on such alignment." name="assert" />
@@ -39,4 +39,4 @@
   <div>T</div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-007.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-007.xht
index 321daf5..01e8839 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-007.xht
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/text-align-vlr-007.xht
@@ -8,7 +8,7 @@
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
   <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#vertical-layout" title="7.1 Principles of Layout in Vertical Writing Modes" />
-  <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht" />
+  <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
 
   <meta content="ahem image" name="flags" />
 
@@ -37,4 +37,4 @@
   <div>T</div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/selectors-4/selectors-dir-selector-ltr-001.html b/third_party/WebKit/LayoutTests/external/csswg-test/selectors-4/selectors-dir-selector-ltr-001.html
index 5ce70ec..9b90832 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/selectors-4/selectors-dir-selector-ltr-001.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/selectors-4/selectors-dir-selector-ltr-001.html
@@ -4,7 +4,7 @@
     <title>CSS Selectors Level 4 Test: basic support for dir(ltr)</title>
     <link rel="author" title="Takeshi Kurosawa" href="mailto:taken.spc@gmail.com">
     <link rel="help" href="http://www.w3.org/TR/selectors4/#dir-pseudo">
-    <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht">
+    <link rel="match" href="../reference/ref-filled-green-100px-square.xht">
     <meta name="flags" content="">
     <meta name="assert" content="The :dir(ltr) pseudo-class matches an element that has a directionality of (ltr). Since the div element has dir=ltr, the selector matches.">
     <style type="text/css">
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/selectors-4/selectors-dir-selector-rtl-001.html b/third_party/WebKit/LayoutTests/external/csswg-test/selectors-4/selectors-dir-selector-rtl-001.html
index d8f5149..9b7bfd090 100644
--- a/third_party/WebKit/LayoutTests/external/csswg-test/selectors-4/selectors-dir-selector-rtl-001.html
+++ b/third_party/WebKit/LayoutTests/external/csswg-test/selectors-4/selectors-dir-selector-rtl-001.html
@@ -4,7 +4,7 @@
     <title>CSS Selectors Level 4 Test: basic support for dir(rtl)</title>
     <link rel="author" title="Takeshi Kurosawa" href="mailto:taken.spc@gmail.com">
     <link rel="help" href="http://www.w3.org/TR/selectors4/#dir-pseudo">
-    <link rel="match" href="../css21/reference/ref-filled-green-100px-square.xht">
+    <link rel="match" href="../reference/ref-filled-green-100px-square.xht">
     <meta name="flags" content="">
     <meta name="assert" content="The :dir(rtl) pseudo-class matches an elment that has a directionality of right-to-left (rtl). Since the div element has dir=rtl, the selector matches.">
     <style type="text/css">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interleaved-cursors.html b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interleaved-cursors.html
new file mode 100644
index 0000000..31126908
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interleaved-cursors.html
@@ -0,0 +1,196 @@
+<!doctype html>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
+<title>IndexedDB: Interleaved iteration of multiple cursors</title>
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+// Number of objects that each iterator goes over.
+const itemCount = 10;
+
+// Ratio of small objects to large objects.
+const largeObjectRatio = 5;
+
+// Size of large objects. This should exceed the size of a block in the storage
+// method underlying the browser's IndexedDB implementation. For example, this
+// needs to exceed the LevelDB block size on Chrome, and the SQLite block size
+// on Firefox.
+const largeObjectSize = 48 * 1024;
+
+function objectKey(cursorIndex, itemIndex) {
+  return `${cursorIndex}-key-${itemIndex}`;
+}
+
+function objectValue(cursorIndex, itemIndex) {
+  if ((cursorIndex * itemCount + itemIndex) % largeObjectRatio === 0) {
+    // We use a typed array (as opposed to a string) because IndexedDB
+    // implementations may serialize strings using UTF-8 or UTF-16, yielding
+    // larger IndexedDB entries than we'd expect. It's very unlikely that an
+    // IndexedDB implementation would use anything other than the raw buffer to
+    // serialize a typed array.
+    const buffer = new Uint8Array(largeObjectSize);
+
+    // Some IndexedDB implementations, like LevelDB, compress their data blocks
+    // before storing them to disk. We use a simple 32-bit xorshift PRNG, which
+    // should be sufficient to foil any fast generic-purpose compression scheme.
+
+    // 32-bit xorshift - the seed can't be zero
+    let state = 1000 + (cursorIndex * itemCount + itemIndex);
+
+    for (let i = 0; i < largeObjectSize; ++i) {
+      state ^= state << 13;
+      state ^= state >> 17;
+      state ^= state << 5;
+      buffer[i] = state & 0xff;
+    }
+
+    return buffer;
+  }
+  return [cursorIndex, 'small', itemIndex];
+}
+
+// Writes the objects to be read by one cursor. Returns a promise that resolves
+// when the write completes.
+//
+// We want to avoid creating a large transaction, because that is outside the
+// test's scope, and it's a bad practice. So we break up the writes across
+// multiple transactions. For simplicity, each transaction writes all the
+// objects that will be read by a cursor.
+function writeCursorObjects(database, cursorIndex) {
+  return new Promise((resolve, reject) => {
+    const transaction = database.transaction('cache', 'readwrite');
+    transaction.onabort = () => { reject(transaction.error); };
+
+    const store = transaction.objectStore('cache');
+    for (let i = 0; i < itemCount; ++i) {
+      store.put({
+          key: objectKey(cursorIndex, i), value: objectValue(cursorIndex, i)});
+    }
+    transaction.oncomplete = resolve;
+  });
+}
+
+// Returns a promise that resolves when the store has been populated.
+function populateTestStore(testCase, database, cursorCount) {
+  let promiseChain = Promise.resolve();
+
+  for (let i = 0; i < cursorCount; ++i)
+    promiseChain = promiseChain.then(() => writeCursorObjects(database, i));
+
+  return promiseChain;
+}
+
+// Reads cursors in an interleaved fashion, as shown below.
+//
+// Given N cursors, each of which points to the beginning of a K-item sequence,
+// the following accesses will be made.
+//
+// OC(i)    = open cursor i
+// RD(i, j) = read result of cursor i, which should be at item j
+// CC(i)    = continue cursor i
+// |        = wait for onsuccess on the previous OC or CC
+//
+// OC(1)            | RD(1, 1) OC(2) | RD(2, 1) OC(3) | ... | RD(n-1, 1) CC(n) |
+// RD(n, 1)   CC(1) | RD(1, 2) CC(2) | RD(2, 2) CC(3) | ... | RD(n-1, 2) CC(n) |
+// RD(n, 2)   CC(1) | RD(1, 3) CC(2) | RD(2, 3) CC(3) | ... | RD(n-1, 3) CC(n) |
+// ...
+// RD(n, k-1) CC(1) | RD(1, k) CC(2) | RD(2, k) CC(3) | ... | RD(n-1, k) CC(n) |
+// RD(n, k)           done
+function interleaveCursors(testCase, store, cursorCount) {
+  return new Promise((resolve, reject) => {
+    // The cursors used for iteration are stored here so each cursor's onsuccess
+    // handler can call continue() on the next cursor.
+    const cursors = [];
+
+    // The results of IDBObjectStore.openCursor() calls are stored here so we
+    // we can change the requests' onsuccess handler after every
+    // IDBCursor.continue() call.
+    const requests = [];
+
+    const checkCursorState = (cursorIndex, itemIndex) => {
+      const cursor = cursors[cursorIndex];
+      assert_equals(cursor.key, objectKey(cursorIndex, itemIndex));
+      assert_equals(cursor.value.key, objectKey(cursorIndex, itemIndex));
+      assert_equals(
+          cursor.value.value.join('-'),
+          objectValue(cursorIndex, itemIndex).join('-'));
+    };
+
+    const openCursor = (cursorIndex, callback) => {
+      const request = store.openCursor(
+          IDBKeyRange.lowerBound(objectKey(cursorIndex, 0)));
+      requests[cursorIndex] = request;
+
+      request.onsuccess = testCase.step_func(() => {
+        const cursor = request.result;
+        cursors[cursorIndex] = cursor;
+        checkCursorState(cursorIndex, 0);
+        callback();
+      });
+      request.onerror = event => reject(request.error);
+    };
+
+    const readItemFromCursor = (cursorIndex, itemIndex, callback) => {
+      const request = requests[cursorIndex];
+      request.onsuccess = testCase.step_func(() => {
+        const cursor = request.result;
+        cursors[cursorIndex] = cursor;
+        checkCursorState(cursorIndex, itemIndex);
+        callback();
+      });
+
+      const cursor = cursors[cursorIndex];
+      cursor.continue();
+    };
+
+    // We open all the cursors one at a time, then cycle through the cursors and
+    // call continue() on each of them. This access pattern causes maximal
+    // trashing to an LRU cursor cache. Eviction scheme aside, any cache will
+    // have to evict some cursors, and this access pattern verifies that the
+    // cache correctly restores the state of evicted cursors.
+    const steps = [];
+    for (let cursorIndex = 0; cursorIndex < cursorCount; ++cursorIndex)
+      steps.push(openCursor.bind(null, cursorIndex));
+    for (let itemIndex = 1; itemIndex < itemCount; ++itemIndex) {
+      for (let cursorIndex = 0; cursorIndex < cursorCount; ++cursorIndex)
+        steps.push(readItemFromCursor.bind(null, cursorIndex, itemIndex));
+    }
+
+    const runStep = (stepIndex) => {
+      if (stepIndex === steps.length) {
+        resolve();
+        return;
+      }
+      steps[stepIndex](() => { runStep(stepIndex + 1); });
+    };
+    runStep(0);
+  });
+}
+
+for (let cursorCount of [1, 10, 100, 500]) {
+  promise_test(testCase => {
+    return createDatabase(testCase, (database, transaction) => {
+      const store = database.createObjectStore('cache',
+          { keyPath: 'key', autoIncrement: true });
+    }).then(database => {
+      return populateTestStore(testCase, database, cursorCount).then(
+          () => database);
+    }).then(database => {
+      database.close();
+    }).then(() => {
+      return openDatabase(testCase);
+    }).then(database => {
+      const transaction = database.transaction('cache', 'readonly');
+      transaction.onabort = () => { reject(transaction.error); };
+
+      const store = transaction.objectStore('cache');
+      return interleaveCursors(testCase, store, cursorCount).then(
+          () => database);
+    }).then(database => {
+      database.close();
+    });
+  }, `${cursorCount} cursors`);
+}
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/support-promises.js b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/support-promises.js
index 2db0512..0762a8d7 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/support-promises.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/support-promises.js
@@ -21,7 +21,7 @@
 // open request.
 //
 // Returns a promise. If the versionchange transaction goes through, the promise
-// resolves to an IndexedDB database that must be closed by the caller. If the
+// resolves to an IndexedDB database that should be closed by the caller. If the
 // versionchange transaction is aborted, the promise resolves to an error.
 function migrateDatabase(testCase, newVersion, migrationCallback) {
   return migrateNamedDatabase(
@@ -37,7 +37,7 @@
 // open request.
 //
 // Returns a promise. If the versionchange transaction goes through, the promise
-// resolves to an IndexedDB database that must be closed by the caller. If the
+// resolves to an IndexedDB database that should be closed by the caller. If the
 // versionchange transaction is aborted, the promise resolves to an error.
 function migrateNamedDatabase(
     testCase, databaseName, newVersion, migrationCallback) {
@@ -88,10 +88,20 @@
       resolve(Promise.resolve(callbackResult).then(() => requestEventPromise));
     });
     request.onerror = event => reject(event.target.error);
-    request.onsuccess = () => reject(new Error(
-        'indexedDB.open should not succeed without creating a ' +
-        'versionchange transaction'));
-  }).then(event => event.target.result || event.target.error);
+    request.onsuccess = () => {
+      const database = request.result;
+      testCase.add_cleanup(() => { database.close(); });
+      reject(new Error(
+          'indexedDB.open should not succeed without creating a ' +
+          'versionchange transaction'));
+    };
+  }).then(event => {
+    const database = event.target.result;
+    if (database) {
+      testCase.add_cleanup(() => { database.close(); });
+    }
+    return database || event.target.error;
+  });
 }
 
 // Creates an IndexedDB database whose name is unique for the test case.
@@ -100,7 +110,7 @@
 // given the created database, the versionchange transaction, and the database
 // open request.
 //
-// Returns a promise that resolves to an IndexedDB database. The caller must
+// Returns a promise that resolves to an IndexedDB database. The caller should
 // close the database.
 function createDatabase(testCase, setupCallback) {
   return createNamedDatabase(testCase, databaseName(testCase), setupCallback);
@@ -112,21 +122,23 @@
 // given the created database, the versionchange transaction, and the database
 // open request.
 //
-// Returns a promise that resolves to an IndexedDB database. The caller must
+// Returns a promise that resolves to an IndexedDB database. The caller should
 // close the database.
 function createNamedDatabase(testCase, databaseName, setupCallback) {
   const request = indexedDB.deleteDatabase(databaseName);
   const eventWatcher = requestWatcher(testCase, request);
 
-  return eventWatcher.wait_for('success').then(event =>
-      migrateNamedDatabase(testCase, databaseName, 1, setupCallback));
+  return eventWatcher.wait_for('success').then(event => {
+    testCase.add_cleanup(() => { indexedDB.deleteDatabase(databaseName); });
+    return migrateNamedDatabase(testCase, databaseName, 1, setupCallback)
+  });
 }
 
 // Opens an IndexedDB database without performing schema changes.
 //
 // The given version number must match the database's current version.
 //
-// Returns a promise that resolves to an IndexedDB database. The caller must
+// Returns a promise that resolves to an IndexedDB database. The caller should
 // close the database.
 function openDatabase(testCase, version) {
   return openNamedDatabase(testCase, databaseName(testCase), version);
@@ -136,12 +148,16 @@
 //
 // The given version number must match the database's current version.
 //
-// Returns a promise that resolves to an IndexedDB database. The caller must
+// Returns a promise that resolves to an IndexedDB database. The caller should
 // close the database.
 function openNamedDatabase(testCase, databaseName, version) {
   const request = indexedDB.open(databaseName, version);
   const eventWatcher = requestWatcher(testCase, request);
-  return eventWatcher.wait_for('success').then(event => event.target.result);
+  return eventWatcher.wait_for('success').then(() => {
+    const database = request.result;
+    testCase.add_cleanup(() => { database.close(); });
+    return database;
+  });
 }
 
 // The data in the 'books' object store records in the first example of the
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
index 53c250d..2e905df7 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 1609 tests; 1428 PASS, 181 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1609 tests; 1429 PASS, 180 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Event interface: existence and properties of interface object 
 PASS Event interface object length 
 PASS Event interface object name 
@@ -405,7 +405,7 @@
 PASS Stringification of xmlDoc 
 PASS Document interface: xmlDoc must inherit property "implementation" with the proper type (0) 
 PASS Document interface: xmlDoc must inherit property "URL" with the proper type (1) 
-FAIL Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) assert_equals: expected "string" but got "object"
+PASS Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) 
 PASS Document interface: xmlDoc must inherit property "origin" with the proper type (3) 
 PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type (4) 
 PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type (5) 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createDocument-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createDocument-expected.txt
index 3c6b78e..20db23f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createDocument-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createDocument-expected.txt
@@ -1,21 +1,21 @@
 This is a testharness.js-based test.
-Found 391 tests; 299 PASS, 92 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 391 tests; 389 PASS, 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS DOMImplementation.createDocument(namespace, qualifiedName, doctype) 
 PASS createDocument test: null,null,null,null 
-FAIL createDocument test: metadata for null,null,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,null,null 
 PASS createDocument test: characterSet aliases for null,null,null 
 PASS createDocument test: null,undefined,null,null 
-FAIL createDocument test: metadata for null,undefined,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,undefined,null 
 PASS createDocument test: characterSet aliases for null,undefined,null 
 PASS createDocument test: null,"foo",null,null 
-FAIL createDocument test: metadata for null,"foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"foo",null 
 PASS createDocument test: characterSet aliases for null,"foo",null 
 PASS createDocument test: null,"1foo",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: null,"f1oo",null,null 
-FAIL createDocument test: metadata for null,"f1oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"f1oo",null 
 PASS createDocument test: characterSet aliases for null,"f1oo",null 
 PASS createDocument test: null,"foo1",null,null 
-FAIL createDocument test: metadata for null,"foo1",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"foo1",null 
 PASS createDocument test: characterSet aliases for null,"foo1",null 
 PASS createDocument test: null,"ெfoo",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: null,"}foo",null,"INVALID_CHARACTER_ERR" 
@@ -38,54 +38,54 @@
 PASS createDocument test: null,"f:o:o",null,"NAMESPACE_ERR" 
 PASS createDocument test: null,":",null,"NAMESPACE_ERR" 
 PASS createDocument test: null,"xml",null,null 
-FAIL createDocument test: metadata for null,"xml",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"xml",null 
 PASS createDocument test: characterSet aliases for null,"xml",null 
 PASS createDocument test: null,"xmlns",null,"NAMESPACE_ERR" 
 PASS createDocument test: null,"xmlfoo",null,null 
-FAIL createDocument test: metadata for null,"xmlfoo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"xmlfoo",null 
 PASS createDocument test: characterSet aliases for null,"xmlfoo",null 
 PASS createDocument test: null,"xml:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: null,"xmlns:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: null,"xmlfoo:bar",null,"NAMESPACE_ERR" 
 PASS createDocument test: null,"null:xml",null,"NAMESPACE_ERR" 
 PASS createDocument test: "",null,null,null 
-FAIL createDocument test: metadata for "",null,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "",null,null 
 PASS createDocument test: characterSet aliases for "",null,null 
 PASS createDocument test: "",":foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "","f:oo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "","foo:",null,"NAMESPACE_ERR" 
 PASS createDocument test: undefined,null,null,null 
-FAIL createDocument test: metadata for undefined,null,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,null,null 
 PASS createDocument test: characterSet aliases for undefined,null,null 
 PASS createDocument test: undefined,undefined,null,null 
-FAIL createDocument test: metadata for undefined,undefined,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,undefined,null 
 PASS createDocument test: characterSet aliases for undefined,undefined,null 
 PASS createDocument test: undefined,"foo",null,null 
-FAIL createDocument test: metadata for undefined,"foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,"foo",null 
 PASS createDocument test: characterSet aliases for undefined,"foo",null 
 PASS createDocument test: undefined,"1foo",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: undefined,"f1oo",null,null 
-FAIL createDocument test: metadata for undefined,"f1oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,"f1oo",null 
 PASS createDocument test: characterSet aliases for undefined,"f1oo",null 
 PASS createDocument test: undefined,"foo1",null,null 
-FAIL createDocument test: metadata for undefined,"foo1",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,"foo1",null 
 PASS createDocument test: characterSet aliases for undefined,"foo1",null 
 PASS createDocument test: undefined,":foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: undefined,"f:oo",null,"NAMESPACE_ERR" 
 PASS createDocument test: undefined,"foo:",null,"NAMESPACE_ERR" 
 PASS createDocument test: undefined,"f::oo",null,"NAMESPACE_ERR" 
 PASS createDocument test: undefined,"xml",null,null 
-FAIL createDocument test: metadata for undefined,"xml",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,"xml",null 
 PASS createDocument test: characterSet aliases for undefined,"xml",null 
 PASS createDocument test: undefined,"xmlns",null,"NAMESPACE_ERR" 
 PASS createDocument test: undefined,"xmlfoo",null,null 
-FAIL createDocument test: metadata for undefined,"xmlfoo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,"xmlfoo",null 
 PASS createDocument test: characterSet aliases for undefined,"xmlfoo",null 
 PASS createDocument test: undefined,"xml:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: undefined,"xmlns:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: undefined,"xmlfoo:bar",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://example.com/","foo",null,null 
-FAIL createDocument test: metadata for "http://example.com/","foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","foo",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","foo",null 
 PASS createDocument test: "http://example.com/","1foo",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "http://example.com/","<foo>",null,"INVALID_CHARACTER_ERR" 
@@ -93,14 +93,14 @@
 PASS createDocument test: "http://example.com/","-foo",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "http://example.com/",".foo",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "http://example.com/","f1oo",null,null 
-FAIL createDocument test: metadata for "http://example.com/","f1oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","f1oo",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","f1oo",null 
 PASS createDocument test: "http://example.com/","foo1",null,null 
-FAIL createDocument test: metadata for "http://example.com/","foo1",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","foo1",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","foo1",null 
 PASS createDocument test: "http://example.com/",":foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://example.com/","f:oo",null,null 
-FAIL createDocument test: metadata for "http://example.com/","f:oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","f:oo",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","f:oo",null 
 PASS createDocument test: "http://example.com/","f:o:o",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://example.com/","foo:",null,"NAMESPACE_ERR" 
@@ -108,68 +108,68 @@
 FAIL createDocument test: "http://example.com/","a:0",null,"NAMESPACE_ERR" assert_throws: function "function () { document.implementation.createDocument(namespace, qualifiedName, doctype) }" threw object "InvalidCharacterError: Failed to execute 'createDocument' on 'DOMImplementation': The qualified name provided ('a:0') contains the invalid name-start character '0'." that is not a DOMException NAMESPACE_ERR: property "code" is equal to 5, expected 14
 PASS createDocument test: "http://example.com/","0:a",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "http://example.com/","a:_",null,null 
-FAIL createDocument test: metadata for "http://example.com/","a:_",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","a:_",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","a:_",null 
 FAIL createDocument test: "http://example.com/","a:ெ",null,"NAMESPACE_ERR" assert_throws: function "function () { document.implementation.createDocument(namespace, qualifiedName, doctype) }" threw object "InvalidCharacterError: Failed to execute 'createDocument' on 'DOMImplementation': The qualified name provided ('a:ெ') contains the invalid name-start character 'ெ'." that is not a DOMException NAMESPACE_ERR: property "code" is equal to 5, expected 14
 PASS createDocument test: "http://example.com/","ெ:a",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "http://example.com/","a:aெ",null,null 
-FAIL createDocument test: metadata for "http://example.com/","a:aெ",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","a:aெ",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","a:aெ",null 
 PASS createDocument test: "http://example.com/","aெ:a",null,null 
-FAIL createDocument test: metadata for "http://example.com/","aெ:a",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","aெ:a",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","aெ:a",null 
 PASS createDocument test: "http://example.com/","xml:test",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://example.com/","xmlns:test",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://example.com/","test:xmlns",null,null 
-FAIL createDocument test: metadata for "http://example.com/","test:xmlns",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","test:xmlns",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","test:xmlns",null 
 PASS createDocument test: "http://example.com/","xmlns",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://example.com/","_:_",null,null 
-FAIL createDocument test: metadata for "http://example.com/","_:_",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","_:_",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","_:_",null 
 PASS createDocument test: "http://example.com/","_:h0",null,null 
-FAIL createDocument test: metadata for "http://example.com/","_:h0",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","_:h0",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","_:h0",null 
 PASS createDocument test: "http://example.com/","_:test",null,null 
-FAIL createDocument test: metadata for "http://example.com/","_:test",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","_:test",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","_:test",null 
 PASS createDocument test: "http://example.com/","l_:_",null,null 
-FAIL createDocument test: metadata for "http://example.com/","l_:_",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","l_:_",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","l_:_",null 
 PASS createDocument test: "http://example.com/","ns:_0",null,null 
-FAIL createDocument test: metadata for "http://example.com/","ns:_0",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","ns:_0",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","ns:_0",null 
 PASS createDocument test: "http://example.com/","ns:a0",null,null 
-FAIL createDocument test: metadata for "http://example.com/","ns:a0",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","ns:a0",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","ns:a0",null 
 PASS createDocument test: "http://example.com/","ns0:test",null,null 
-FAIL createDocument test: metadata for "http://example.com/","ns0:test",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","ns0:test",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","ns0:test",null 
 PASS createDocument test: "http://example.com/","a.b:c",null,null 
-FAIL createDocument test: metadata for "http://example.com/","a.b:c",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","a.b:c",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","a.b:c",null 
 PASS createDocument test: "http://example.com/","a-b:c",null,null 
-FAIL createDocument test: metadata for "http://example.com/","a-b:c",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","a-b:c",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","a-b:c",null 
 PASS createDocument test: "http://example.com/","xml",null,null 
-FAIL createDocument test: metadata for "http://example.com/","xml",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","xml",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","xml",null 
 PASS createDocument test: "http://example.com/","XMLNS",null,null 
-FAIL createDocument test: metadata for "http://example.com/","XMLNS",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","XMLNS",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","XMLNS",null 
 PASS createDocument test: "http://example.com/","xmlfoo",null,null 
-FAIL createDocument test: metadata for "http://example.com/","xmlfoo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","xmlfoo",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","xmlfoo",null 
 PASS createDocument test: "http://example.com/","xml:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://example.com/","XML:foo",null,null 
-FAIL createDocument test: metadata for "http://example.com/","XML:foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","XML:foo",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","XML:foo",null 
 PASS createDocument test: "http://example.com/","xmlns:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://example.com/","XMLNS:foo",null,null 
-FAIL createDocument test: metadata for "http://example.com/","XMLNS:foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","XMLNS:foo",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","XMLNS:foo",null 
 PASS createDocument test: "http://example.com/","xmlfoo:bar",null,null 
-FAIL createDocument test: metadata for "http://example.com/","xmlfoo:bar",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","xmlfoo:bar",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","xmlfoo:bar",null 
 PASS createDocument test: "http://example.com/","prefix::local",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://example.com/","namespaceURI:{",null,"INVALID_CHARACTER_ERR" 
@@ -200,60 +200,60 @@
 PASS createDocument test: "http://example.com/","namespaceURI:a ",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "http://example.com/","namespaceURI:\"",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "/","foo",null,null 
-FAIL createDocument test: metadata for "/","foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "/","foo",null 
 PASS createDocument test: characterSet aliases for "/","foo",null 
 PASS createDocument test: "/","1foo",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "/","f1oo",null,null 
-FAIL createDocument test: metadata for "/","f1oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "/","f1oo",null 
 PASS createDocument test: characterSet aliases for "/","f1oo",null 
 PASS createDocument test: "/","foo1",null,null 
-FAIL createDocument test: metadata for "/","foo1",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "/","foo1",null 
 PASS createDocument test: characterSet aliases for "/","foo1",null 
 PASS createDocument test: "/",":foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "/","f:oo",null,null 
-FAIL createDocument test: metadata for "/","f:oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "/","f:oo",null 
 PASS createDocument test: characterSet aliases for "/","f:oo",null 
 PASS createDocument test: "/","foo:",null,"NAMESPACE_ERR" 
 PASS createDocument test: "/","xml",null,null 
-FAIL createDocument test: metadata for "/","xml",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "/","xml",null 
 PASS createDocument test: characterSet aliases for "/","xml",null 
 PASS createDocument test: "/","xmlns",null,"NAMESPACE_ERR" 
 PASS createDocument test: "/","xmlfoo",null,null 
-FAIL createDocument test: metadata for "/","xmlfoo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "/","xmlfoo",null 
 PASS createDocument test: characterSet aliases for "/","xmlfoo",null 
 PASS createDocument test: "/","xml:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "/","xmlns:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "/","xmlfoo:bar",null,null 
-FAIL createDocument test: metadata for "/","xmlfoo:bar",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "/","xmlfoo:bar",null 
 PASS createDocument test: characterSet aliases for "/","xmlfoo:bar",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","foo",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","foo",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","foo",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","1foo",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","f1oo",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","f1oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","f1oo",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","f1oo",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","foo1",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","foo1",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","foo1",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","foo1",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace",":foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","f:oo",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","f:oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","f:oo",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","f:oo",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","foo:",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xml",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xml",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xml",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","xml",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xmlns",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xmlfoo",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xmlfoo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xmlfoo",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","xmlfoo",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xml:foo",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xml:foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xml:foo",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","xml:foo",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xmlns:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xmlfoo:bar",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xmlfoo:bar",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xmlfoo:bar",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","xmlfoo:bar",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespaces","xml:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/xml/1998/namespace","xml:foo",null,"NAMESPACE_ERR" 
@@ -266,126 +266,126 @@
 PASS createDocument test: "http://www.w3.org/2000/xmlns/","foo:",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/2000/xmlns/","xml",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/2000/xmlns/","xmlns",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/2000/xmlns/","xmlns",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/2000/xmlns/","xmlns",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/xmlns/","xmlns",null 
 PASS createDocument test: "http://www.w3.org/2000/xmlns/","xmlfoo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/2000/xmlns/","xml:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/2000/xmlns/","xmlns:foo",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/2000/xmlns/","xmlns:foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/2000/xmlns/","xmlns:foo",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/xmlns/","xmlns:foo",null 
 PASS createDocument test: "http://www.w3.org/2000/xmlns/","xmlfoo:bar",null,"NAMESPACE_ERR" 
 PASS createDocument test: "http://www.w3.org/2000/xmlns/","foo:xmlns",null,"NAMESPACE_ERR" 
 PASS createDocument test: "foo:","foo",null,null 
-FAIL createDocument test: metadata for "foo:","foo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo:","foo",null 
 PASS createDocument test: characterSet aliases for "foo:","foo",null 
 PASS createDocument test: "foo:","1foo",null,"INVALID_CHARACTER_ERR" 
 PASS createDocument test: "foo:","f1oo",null,null 
-FAIL createDocument test: metadata for "foo:","f1oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo:","f1oo",null 
 PASS createDocument test: characterSet aliases for "foo:","f1oo",null 
 PASS createDocument test: "foo:","foo1",null,null 
-FAIL createDocument test: metadata for "foo:","foo1",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo:","foo1",null 
 PASS createDocument test: characterSet aliases for "foo:","foo1",null 
 PASS createDocument test: "foo:",":foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "foo:","f:oo",null,null 
-FAIL createDocument test: metadata for "foo:","f:oo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo:","f:oo",null 
 PASS createDocument test: characterSet aliases for "foo:","f:oo",null 
 PASS createDocument test: "foo:","foo:",null,"NAMESPACE_ERR" 
 PASS createDocument test: "foo:","xml",null,null 
-FAIL createDocument test: metadata for "foo:","xml",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo:","xml",null 
 PASS createDocument test: characterSet aliases for "foo:","xml",null 
 PASS createDocument test: "foo:","xmlns",null,"NAMESPACE_ERR" 
 PASS createDocument test: "foo:","xmlfoo",null,null 
-FAIL createDocument test: metadata for "foo:","xmlfoo",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo:","xmlfoo",null 
 PASS createDocument test: characterSet aliases for "foo:","xmlfoo",null 
 PASS createDocument test: "foo:","xml:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "foo:","xmlns:foo",null,"NAMESPACE_ERR" 
 PASS createDocument test: "foo:","xmlfoo:bar",null,null 
-FAIL createDocument test: metadata for "foo:","xmlfoo:bar",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo:","xmlfoo:bar",null 
 PASS createDocument test: characterSet aliases for "foo:","xmlfoo:bar",null 
 PASS createDocument test: null,null,false,object "TypeError" 
 PASS createDocument test: null,"",null,null 
-FAIL createDocument test: metadata for null,"",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"",null 
 PASS createDocument test: characterSet aliases for null,"",null 
 PASS createDocument test: undefined,null,undefined,null 
-FAIL createDocument test: metadata for undefined,null,undefined assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,null,undefined 
 PASS createDocument test: characterSet aliases for undefined,null,undefined 
 PASS createDocument test: undefined,undefined,undefined,null 
-FAIL createDocument test: metadata for undefined,undefined,undefined assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,undefined,undefined 
 PASS createDocument test: characterSet aliases for undefined,undefined,undefined 
 PASS createDocument test: undefined,"",undefined,null 
-FAIL createDocument test: metadata for undefined,"",undefined assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for undefined,"",undefined 
 PASS createDocument test: characterSet aliases for undefined,"",undefined 
 PASS createDocument test: "http://example.com/",null,null,null 
-FAIL createDocument test: metadata for "http://example.com/",null,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/",null,null 
 PASS createDocument test: characterSet aliases for "http://example.com/",null,null 
 PASS createDocument test: "http://example.com/","",null,null 
-FAIL createDocument test: metadata for "http://example.com/","",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://example.com/","",null 
 PASS createDocument test: characterSet aliases for "http://example.com/","",null 
 PASS createDocument test: "/",null,null,null 
-FAIL createDocument test: metadata for "/",null,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "/",null,null 
 PASS createDocument test: characterSet aliases for "/",null,null 
 PASS createDocument test: "/","",null,null 
-FAIL createDocument test: metadata for "/","",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "/","",null 
 PASS createDocument test: characterSet aliases for "/","",null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace",null,null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace",null,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace",null,null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace",null,null 
 PASS createDocument test: "http://www.w3.org/XML/1998/namespace","",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","",null 
 PASS createDocument test: "http://www.w3.org/2000/xmlns/",null,null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/2000/xmlns/",null,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/2000/xmlns/",null,null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/xmlns/",null,null 
 PASS createDocument test: "http://www.w3.org/2000/xmlns/","",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/2000/xmlns/","",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/2000/xmlns/","",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/xmlns/","",null 
 PASS createDocument test: "foo:",null,null,null 
-FAIL createDocument test: metadata for "foo:",null,null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo:",null,null 
 PASS createDocument test: characterSet aliases for "foo:",null,null 
 PASS createDocument test: "foo:","",null,null 
-FAIL createDocument test: metadata for "foo:","",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo:","",null 
 PASS createDocument test: characterSet aliases for "foo:","",null 
 PASS createDocument test: null,null,DocumentType node <!DOCTYPE foo>,null 
-FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE foo> assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE foo> 
 PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE foo> 
 PASS createDocument test: null,null,DocumentType node <!DOCTYPE html>,null 
-FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE html> assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE html> 
 PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE html> 
 PASS createDocument test: null,null,DocumentType node <!DOCTYPE bar>,null 
-FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE bar> assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE bar> 
 PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE bar> 
 PASS createDocument test: null,null,DocumentType node <!DOCTYPE baz>,null 
-FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE baz> assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE baz> 
 PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE baz> 
 PASS createDocument test: null,null,DocumentType node <!DOCTYPE quz>,null 
-FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE quz> assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE quz> 
 PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE quz> 
 PASS createDocument test: null,"foo",DocumentType node <!DOCTYPE foo>,null 
-FAIL createDocument test: metadata for null,"foo",DocumentType node <!DOCTYPE foo> assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"foo",DocumentType node <!DOCTYPE foo> 
 PASS createDocument test: characterSet aliases for null,"foo",DocumentType node <!DOCTYPE foo> 
 PASS createDocument test: "foo",null,DocumentType node <!DOCTYPE foo>,null 
-FAIL createDocument test: metadata for "foo",null,DocumentType node <!DOCTYPE foo> assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo",null,DocumentType node <!DOCTYPE foo> 
 PASS createDocument test: characterSet aliases for "foo",null,DocumentType node <!DOCTYPE foo> 
 PASS createDocument test: "foo","bar",DocumentType node <!DOCTYPE foo>,null 
-FAIL createDocument test: metadata for "foo","bar",DocumentType node <!DOCTYPE foo> assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "foo","bar",DocumentType node <!DOCTYPE foo> 
 PASS createDocument test: characterSet aliases for "foo","bar",DocumentType node <!DOCTYPE foo> 
 PASS createDocument test: "http://www.w3.org/1999/xhtml","",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/1999/xhtml","",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/1999/xhtml","",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/1999/xhtml","",null 
 PASS createDocument test: "http://www.w3.org/2000/svg","",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/2000/svg","",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/2000/svg","",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/svg","",null 
 PASS createDocument test: "http://www.w3.org/1998/Math/MathML","",null,null 
-FAIL createDocument test: metadata for "http://www.w3.org/1998/Math/MathML","",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for "http://www.w3.org/1998/Math/MathML","",null 
 PASS createDocument test: characterSet aliases for "http://www.w3.org/1998/Math/MathML","",null 
 PASS createDocument test: null,"html",null,null 
-FAIL createDocument test: metadata for null,"html",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"html",null 
 PASS createDocument test: characterSet aliases for null,"html",null 
 PASS createDocument test: null,"svg",null,null 
-FAIL createDocument test: metadata for null,"svg",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"svg",null 
 PASS createDocument test: characterSet aliases for null,"svg",null 
 PASS createDocument test: null,"math",null,null 
-FAIL createDocument test: metadata for null,"math",null assert_equals: expected "about:blank" but got ""
+PASS createDocument test: metadata for null,"math",null 
 PASS createDocument test: characterSet aliases for null,"math",null 
 PASS createDocument test: null,"",DocumentType node <!DOCTYPE html -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> 
 PASS createDocument test: null,"",DocumentType node <!DOCTYPE svg -//W3C//DTD SVG 1.1//EN http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd> 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createHTMLDocument-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createHTMLDocument-expected.txt
deleted file mode 100644
index fb7b8e501c..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createHTMLDocument-expected.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-This is a testharness.js-based test.
-PASS createHTMLDocument test 0: "","","" 
-PASS createHTMLDocument test 1: null,"null","null" 
-PASS createHTMLDocument test 2: undefined,undefined,"" 
-PASS createHTMLDocument test 3: "foo  bar baz","foo  bar baz","foo bar baz" 
-PASS createHTMLDocument test 4: "foo\t\tbar baz","foo\t\tbar baz","foo bar baz" 
-PASS createHTMLDocument test 5: "foo\n\nbar baz","foo\n\nbar baz","foo bar baz" 
-PASS createHTMLDocument test 6: "foo\f\fbar baz","foo\f\fbar baz","foo bar baz" 
-PASS createHTMLDocument test 7: "foo\r\rbar baz","foo\r\rbar baz","foo bar baz" 
-PASS Missing title argument 
-FAIL createHTMLDocument(): metadata assert_equals: expected "about:blank" but got ""
-PASS createHTMLDocument(): characterSet aliases 
-PASS createHTMLDocument(): URL parsing 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-cloneNode-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-cloneNode-expected.txt
index 2ec229e..1424f3a5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-cloneNode-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-cloneNode-expected.txt
@@ -130,7 +130,7 @@
 PASS createElementNS non-HTML 
 PASS createProcessingInstruction 
 PASS implementation.createDocumentType 
-FAIL implementation.createDocument assert_equals: expected "about:blank" but got ""
+FAIL implementation.createDocument assert_equals: expected "null" but got "http://web-platform.test:8001"
 PASS implementation.createHTMLDocument 
 PASS node with children 
 Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-properties-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-properties-expected.txt
deleted file mode 100644
index bd197bf..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-properties-expected.txt
+++ /dev/null
@@ -1,703 +0,0 @@
-This is a testharness.js-based test.
-Found 699 tests; 695 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS testDiv.nodeType 
-PASS testDiv.ownerDocument 
-PASS testDiv.parentNode 
-PASS testDiv.parentElement 
-PASS testDiv.childNodes.length 
-PASS testDiv.childNodes[0] 
-PASS testDiv.childNodes[1] 
-PASS testDiv.childNodes[2] 
-PASS testDiv.childNodes[3] 
-PASS testDiv.childNodes[4] 
-PASS testDiv.childNodes[5] 
-PASS testDiv.previousSibling 
-PASS testDiv.nextSibling 
-PASS testDiv.textContent 
-PASS testDiv.namespaceURI 
-PASS testDiv.prefix 
-PASS testDiv.localName 
-PASS testDiv.tagName 
-PASS testDiv.id 
-PASS testDiv.children[0] 
-PASS testDiv.children[1] 
-PASS testDiv.children[2] 
-PASS testDiv.children[3] 
-PASS testDiv.children[4] 
-PASS testDiv.previousElementSibling 
-PASS testDiv.childElementCount 
-PASS testDiv.nodeName 
-PASS testDiv.nodeValue 
-PASS testDiv.children.length 
-PASS testDiv.className 
-PASS testDiv.firstElementChild 
-PASS testDiv.lastElementChild 
-PASS testDiv.firstChild 
-PASS testDiv.lastChild 
-PASS testDiv.hasChildNodes() 
-PASS detachedDiv.nodeType 
-PASS detachedDiv.ownerDocument 
-PASS detachedDiv.parentNode 
-PASS detachedDiv.parentElement 
-PASS detachedDiv.childNodes.length 
-PASS detachedDiv.childNodes[0] 
-PASS detachedDiv.childNodes[1] 
-PASS detachedDiv.previousSibling 
-PASS detachedDiv.nextSibling 
-PASS detachedDiv.textContent 
-PASS detachedDiv.namespaceURI 
-PASS detachedDiv.prefix 
-PASS detachedDiv.localName 
-PASS detachedDiv.tagName 
-PASS detachedDiv.children[0] 
-PASS detachedDiv.children[1] 
-PASS detachedDiv.previousElementSibling 
-PASS detachedDiv.nextElementSibling 
-PASS detachedDiv.childElementCount 
-PASS detachedDiv.nodeName 
-PASS detachedDiv.nodeValue 
-PASS detachedDiv.children.length 
-PASS detachedDiv.id 
-PASS detachedDiv.className 
-PASS detachedDiv.firstElementChild 
-PASS detachedDiv.lastElementChild 
-PASS detachedDiv.firstChild 
-PASS detachedDiv.lastChild 
-PASS detachedDiv.hasChildNodes() 
-PASS detachedPara1.nodeType 
-PASS detachedPara1.ownerDocument 
-PASS detachedPara1.parentNode 
-PASS detachedPara1.parentElement 
-PASS detachedPara1.childNodes.length 
-PASS detachedPara1.previousSibling 
-PASS detachedPara1.nextSibling 
-PASS detachedPara1.textContent 
-PASS detachedPara1.namespaceURI 
-PASS detachedPara1.prefix 
-PASS detachedPara1.localName 
-PASS detachedPara1.tagName 
-PASS detachedPara1.previousElementSibling 
-PASS detachedPara1.nextElementSibling 
-PASS detachedPara1.childElementCount 
-PASS detachedPara1.nodeName 
-PASS detachedPara1.nodeValue 
-PASS detachedPara1.children.length 
-PASS detachedPara1.id 
-PASS detachedPara1.className 
-PASS detachedPara1.lastElementChild 
-PASS detachedPara1.firstElementChild 
-PASS detachedPara1.firstChild 
-PASS detachedPara1.lastChild 
-PASS detachedPara1.hasChildNodes() 
-PASS detachedPara2.nodeType 
-PASS detachedPara2.ownerDocument 
-PASS detachedPara2.parentNode 
-PASS detachedPara2.parentElement 
-PASS detachedPara2.childNodes.length 
-PASS detachedPara2.previousSibling 
-PASS detachedPara2.nextSibling 
-PASS detachedPara2.textContent 
-PASS detachedPara2.namespaceURI 
-PASS detachedPara2.prefix 
-PASS detachedPara2.localName 
-PASS detachedPara2.tagName 
-PASS detachedPara2.previousElementSibling 
-PASS detachedPara2.nextElementSibling 
-PASS detachedPara2.childElementCount 
-PASS detachedPara2.nodeName 
-PASS detachedPara2.nodeValue 
-PASS detachedPara2.children.length 
-PASS detachedPara2.id 
-PASS detachedPara2.className 
-PASS detachedPara2.lastElementChild 
-PASS detachedPara2.firstElementChild 
-PASS detachedPara2.firstChild 
-PASS detachedPara2.lastChild 
-PASS detachedPara2.hasChildNodes() 
-PASS document.nodeType 
-PASS document.childNodes.length 
-PASS document.childNodes[0] 
-PASS document.childNodes[1] 
-PASS document.URL 
-PASS document.compatMode 
-PASS document.characterSet 
-PASS document.contentType 
-PASS document.doctype 
-PASS document.nodeName 
-PASS document.textContent 
-PASS document.nodeValue 
-PASS document.nextSibling 
-PASS document.previousSibling 
-PASS document.parentElement 
-PASS document.parentNode 
-PASS document.ownerDocument 
-PASS document.documentURI 
-PASS document.inputEncoding 
-PASS document.charset 
-PASS document.firstChild 
-PASS document.lastChild 
-PASS document.hasChildNodes() 
-PASS foreignDoc.nodeType 
-PASS foreignDoc.childNodes.length 
-PASS foreignDoc.childNodes[0] 
-PASS foreignDoc.childNodes[1] 
-PASS foreignDoc.childNodes[2] 
-FAIL foreignDoc.URL assert_equals: expected "about:blank" but got ""
-PASS foreignDoc.compatMode 
-PASS foreignDoc.characterSet 
-PASS foreignDoc.contentType 
-PASS foreignDoc.nodeName 
-PASS foreignDoc.textContent 
-PASS foreignDoc.nodeValue 
-PASS foreignDoc.nextSibling 
-PASS foreignDoc.previousSibling 
-PASS foreignDoc.parentElement 
-PASS foreignDoc.parentNode 
-PASS foreignDoc.ownerDocument 
-FAIL foreignDoc.documentURI assert_equals: expected (string) "about:blank" but got (object) null
-PASS foreignDoc.inputEncoding 
-PASS foreignDoc.charset 
-PASS foreignDoc.firstChild 
-PASS foreignDoc.lastChild 
-PASS foreignDoc.hasChildNodes() 
-PASS foreignPara1.nodeType 
-PASS foreignPara1.ownerDocument 
-PASS foreignPara1.parentNode 
-PASS foreignPara1.parentElement 
-PASS foreignPara1.childNodes.length 
-PASS foreignPara1.previousSibling 
-PASS foreignPara1.nextSibling 
-PASS foreignPara1.textContent 
-PASS foreignPara1.namespaceURI 
-PASS foreignPara1.prefix 
-PASS foreignPara1.localName 
-PASS foreignPara1.tagName 
-PASS foreignPara1.previousElementSibling 
-PASS foreignPara1.nextElementSibling 
-PASS foreignPara1.childElementCount 
-PASS foreignPara1.nodeName 
-PASS foreignPara1.nodeValue 
-PASS foreignPara1.children.length 
-PASS foreignPara1.id 
-PASS foreignPara1.className 
-PASS foreignPara1.lastElementChild 
-PASS foreignPara1.firstElementChild 
-PASS foreignPara1.firstChild 
-PASS foreignPara1.lastChild 
-PASS foreignPara1.hasChildNodes() 
-PASS foreignPara2.nodeType 
-PASS foreignPara2.ownerDocument 
-PASS foreignPara2.parentNode 
-PASS foreignPara2.parentElement 
-PASS foreignPara2.childNodes.length 
-PASS foreignPara2.previousSibling 
-PASS foreignPara2.nextSibling 
-PASS foreignPara2.textContent 
-PASS foreignPara2.namespaceURI 
-PASS foreignPara2.prefix 
-PASS foreignPara2.localName 
-PASS foreignPara2.tagName 
-PASS foreignPara2.previousElementSibling 
-PASS foreignPara2.nextElementSibling 
-PASS foreignPara2.childElementCount 
-PASS foreignPara2.nodeName 
-PASS foreignPara2.nodeValue 
-PASS foreignPara2.children.length 
-PASS foreignPara2.id 
-PASS foreignPara2.className 
-PASS foreignPara2.lastElementChild 
-PASS foreignPara2.firstElementChild 
-PASS foreignPara2.firstChild 
-PASS foreignPara2.lastChild 
-PASS foreignPara2.hasChildNodes() 
-PASS xmlDoc.nodeType 
-PASS xmlDoc.childNodes.length 
-PASS xmlDoc.childNodes[0] 
-PASS xmlDoc.childNodes[1] 
-PASS xmlDoc.childNodes[2] 
-PASS xmlDoc.childNodes[3] 
-FAIL xmlDoc.URL assert_equals: expected "about:blank" but got ""
-PASS xmlDoc.compatMode 
-PASS xmlDoc.characterSet 
-PASS xmlDoc.contentType 
-PASS xmlDoc.nodeName 
-PASS xmlDoc.textContent 
-PASS xmlDoc.nodeValue 
-PASS xmlDoc.nextSibling 
-PASS xmlDoc.previousSibling 
-PASS xmlDoc.parentElement 
-PASS xmlDoc.parentNode 
-PASS xmlDoc.ownerDocument 
-FAIL xmlDoc.documentURI assert_equals: expected (string) "about:blank" but got (object) null
-PASS xmlDoc.inputEncoding 
-PASS xmlDoc.charset 
-PASS xmlDoc.firstChild 
-PASS xmlDoc.lastChild 
-PASS xmlDoc.hasChildNodes() 
-PASS xmlElement.nodeType 
-PASS xmlElement.ownerDocument 
-PASS xmlElement.parentNode 
-PASS xmlElement.parentElement 
-PASS xmlElement.childNodes.length 
-PASS xmlElement.childNodes[0] 
-PASS xmlElement.previousSibling 
-PASS xmlElement.nextSibling 
-PASS xmlElement.textContent 
-PASS xmlElement.namespaceURI 
-PASS xmlElement.prefix 
-PASS xmlElement.localName 
-PASS xmlElement.tagName 
-PASS xmlElement.previousElementSibling 
-PASS xmlElement.nextElementSibling 
-PASS xmlElement.childElementCount 
-PASS xmlElement.nodeName 
-PASS xmlElement.nodeValue 
-PASS xmlElement.children.length 
-PASS xmlElement.id 
-PASS xmlElement.className 
-PASS xmlElement.lastElementChild 
-PASS xmlElement.firstElementChild 
-PASS xmlElement.firstChild 
-PASS xmlElement.lastChild 
-PASS xmlElement.hasChildNodes() 
-PASS detachedXmlElement.nodeType 
-PASS detachedXmlElement.ownerDocument 
-PASS detachedXmlElement.parentNode 
-PASS detachedXmlElement.parentElement 
-PASS detachedXmlElement.childNodes.length 
-PASS detachedXmlElement.previousSibling 
-PASS detachedXmlElement.nextSibling 
-PASS detachedXmlElement.textContent 
-PASS detachedXmlElement.namespaceURI 
-PASS detachedXmlElement.prefix 
-PASS detachedXmlElement.localName 
-PASS detachedXmlElement.tagName 
-PASS detachedXmlElement.previousElementSibling 
-PASS detachedXmlElement.nextElementSibling 
-PASS detachedXmlElement.childElementCount 
-PASS detachedXmlElement.nodeName 
-PASS detachedXmlElement.nodeValue 
-PASS detachedXmlElement.children.length 
-PASS detachedXmlElement.id 
-PASS detachedXmlElement.className 
-PASS detachedXmlElement.lastElementChild 
-PASS detachedXmlElement.firstElementChild 
-PASS detachedXmlElement.lastChild 
-PASS detachedXmlElement.firstChild 
-PASS detachedXmlElement.hasChildNodes() 
-PASS detachedTextNode.nodeType 
-PASS detachedTextNode.ownerDocument 
-PASS detachedTextNode.parentNode 
-PASS detachedTextNode.parentElement 
-PASS detachedTextNode.previousSibling 
-PASS detachedTextNode.nextSibling 
-PASS detachedTextNode.nodeValue 
-PASS detachedTextNode.wholeText 
-PASS detachedTextNode.nodeName 
-PASS detachedTextNode.childNodes.length 
-PASS detachedTextNode.data 
-PASS detachedTextNode.textContent 
-PASS detachedTextNode.length 
-PASS detachedTextNode.lastChild 
-PASS detachedTextNode.firstChild 
-PASS detachedTextNode.hasChildNodes() 
-PASS foreignTextNode.nodeType 
-PASS foreignTextNode.ownerDocument 
-PASS foreignTextNode.parentNode 
-PASS foreignTextNode.parentElement 
-PASS foreignTextNode.previousSibling 
-PASS foreignTextNode.nextSibling 
-PASS foreignTextNode.nodeValue 
-PASS foreignTextNode.wholeText 
-PASS foreignTextNode.nodeName 
-PASS foreignTextNode.childNodes.length 
-PASS foreignTextNode.data 
-PASS foreignTextNode.textContent 
-PASS foreignTextNode.length 
-PASS foreignTextNode.lastChild 
-PASS foreignTextNode.firstChild 
-PASS foreignTextNode.hasChildNodes() 
-PASS detachedForeignTextNode.nodeType 
-PASS detachedForeignTextNode.ownerDocument 
-PASS detachedForeignTextNode.parentNode 
-PASS detachedForeignTextNode.parentElement 
-PASS detachedForeignTextNode.previousSibling 
-PASS detachedForeignTextNode.nextSibling 
-PASS detachedForeignTextNode.nodeValue 
-PASS detachedForeignTextNode.wholeText 
-PASS detachedForeignTextNode.nodeName 
-PASS detachedForeignTextNode.childNodes.length 
-PASS detachedForeignTextNode.data 
-PASS detachedForeignTextNode.textContent 
-PASS detachedForeignTextNode.length 
-PASS detachedForeignTextNode.lastChild 
-PASS detachedForeignTextNode.firstChild 
-PASS detachedForeignTextNode.hasChildNodes() 
-PASS xmlTextNode.nodeType 
-PASS xmlTextNode.ownerDocument 
-PASS xmlTextNode.parentNode 
-PASS xmlTextNode.parentElement 
-PASS xmlTextNode.previousSibling 
-PASS xmlTextNode.nextSibling 
-PASS xmlTextNode.nodeValue 
-PASS xmlTextNode.wholeText 
-PASS xmlTextNode.nodeName 
-PASS xmlTextNode.childNodes.length 
-PASS xmlTextNode.data 
-PASS xmlTextNode.textContent 
-PASS xmlTextNode.length 
-PASS xmlTextNode.lastChild 
-PASS xmlTextNode.firstChild 
-PASS xmlTextNode.hasChildNodes() 
-PASS detachedXmlTextNode.nodeType 
-PASS detachedXmlTextNode.ownerDocument 
-PASS detachedXmlTextNode.parentNode 
-PASS detachedXmlTextNode.parentElement 
-PASS detachedXmlTextNode.previousSibling 
-PASS detachedXmlTextNode.nextSibling 
-PASS detachedXmlTextNode.nodeValue 
-PASS detachedXmlTextNode.wholeText 
-PASS detachedXmlTextNode.nodeName 
-PASS detachedXmlTextNode.childNodes.length 
-PASS detachedXmlTextNode.data 
-PASS detachedXmlTextNode.textContent 
-PASS detachedXmlTextNode.length 
-PASS detachedXmlTextNode.lastChild 
-PASS detachedXmlTextNode.firstChild 
-PASS detachedXmlTextNode.hasChildNodes() 
-PASS processingInstruction.nodeType 
-PASS processingInstruction.ownerDocument 
-PASS processingInstruction.parentNode 
-PASS processingInstruction.parentElement 
-PASS processingInstruction.previousSibling 
-PASS processingInstruction.nextSibling 
-PASS processingInstruction.nodeValue 
-PASS processingInstruction.target 
-PASS processingInstruction.nodeName 
-PASS processingInstruction.childNodes.length 
-PASS processingInstruction.data 
-PASS processingInstruction.textContent 
-PASS processingInstruction.length 
-PASS processingInstruction.lastChild 
-PASS processingInstruction.firstChild 
-PASS processingInstruction.hasChildNodes() 
-PASS detachedProcessingInstruction.nodeType 
-PASS detachedProcessingInstruction.ownerDocument 
-PASS detachedProcessingInstruction.parentNode 
-PASS detachedProcessingInstruction.parentElement 
-PASS detachedProcessingInstruction.previousSibling 
-PASS detachedProcessingInstruction.nextSibling 
-PASS detachedProcessingInstruction.nodeValue 
-PASS detachedProcessingInstruction.target 
-PASS detachedProcessingInstruction.nodeName 
-PASS detachedProcessingInstruction.childNodes.length 
-PASS detachedProcessingInstruction.data 
-PASS detachedProcessingInstruction.textContent 
-PASS detachedProcessingInstruction.length 
-PASS detachedProcessingInstruction.lastChild 
-PASS detachedProcessingInstruction.firstChild 
-PASS detachedProcessingInstruction.hasChildNodes() 
-PASS comment.nodeType 
-PASS comment.ownerDocument 
-PASS comment.parentNode 
-PASS comment.parentElement 
-PASS comment.previousSibling 
-PASS comment.nextSibling 
-PASS comment.nodeValue 
-PASS comment.nodeName 
-PASS comment.childNodes.length 
-PASS comment.data 
-PASS comment.textContent 
-PASS comment.length 
-PASS comment.lastChild 
-PASS comment.firstChild 
-PASS comment.hasChildNodes() 
-PASS detachedComment.nodeType 
-PASS detachedComment.ownerDocument 
-PASS detachedComment.parentNode 
-PASS detachedComment.parentElement 
-PASS detachedComment.previousSibling 
-PASS detachedComment.nextSibling 
-PASS detachedComment.nodeValue 
-PASS detachedComment.nodeName 
-PASS detachedComment.childNodes.length 
-PASS detachedComment.data 
-PASS detachedComment.textContent 
-PASS detachedComment.length 
-PASS detachedComment.lastChild 
-PASS detachedComment.firstChild 
-PASS detachedComment.hasChildNodes() 
-PASS foreignComment.nodeType 
-PASS foreignComment.ownerDocument 
-PASS foreignComment.parentNode 
-PASS foreignComment.parentElement 
-PASS foreignComment.previousSibling 
-PASS foreignComment.nextSibling 
-PASS foreignComment.nodeValue 
-PASS foreignComment.nodeName 
-PASS foreignComment.childNodes.length 
-PASS foreignComment.data 
-PASS foreignComment.textContent 
-PASS foreignComment.length 
-PASS foreignComment.lastChild 
-PASS foreignComment.firstChild 
-PASS foreignComment.hasChildNodes() 
-PASS detachedForeignComment.nodeType 
-PASS detachedForeignComment.ownerDocument 
-PASS detachedForeignComment.parentNode 
-PASS detachedForeignComment.parentElement 
-PASS detachedForeignComment.previousSibling 
-PASS detachedForeignComment.nextSibling 
-PASS detachedForeignComment.nodeValue 
-PASS detachedForeignComment.nodeName 
-PASS detachedForeignComment.childNodes.length 
-PASS detachedForeignComment.data 
-PASS detachedForeignComment.textContent 
-PASS detachedForeignComment.length 
-PASS detachedForeignComment.lastChild 
-PASS detachedForeignComment.firstChild 
-PASS detachedForeignComment.hasChildNodes() 
-PASS xmlComment.nodeType 
-PASS xmlComment.ownerDocument 
-PASS xmlComment.parentNode 
-PASS xmlComment.parentElement 
-PASS xmlComment.previousSibling 
-PASS xmlComment.nextSibling 
-PASS xmlComment.nodeValue 
-PASS xmlComment.nodeName 
-PASS xmlComment.childNodes.length 
-PASS xmlComment.data 
-PASS xmlComment.textContent 
-PASS xmlComment.length 
-PASS xmlComment.lastChild 
-PASS xmlComment.firstChild 
-PASS xmlComment.hasChildNodes() 
-PASS detachedXmlComment.nodeType 
-PASS detachedXmlComment.ownerDocument 
-PASS detachedXmlComment.parentNode 
-PASS detachedXmlComment.parentElement 
-PASS detachedXmlComment.previousSibling 
-PASS detachedXmlComment.nextSibling 
-PASS detachedXmlComment.nodeValue 
-PASS detachedXmlComment.nodeName 
-PASS detachedXmlComment.childNodes.length 
-PASS detachedXmlComment.data 
-PASS detachedXmlComment.textContent 
-PASS detachedXmlComment.length 
-PASS detachedXmlComment.lastChild 
-PASS detachedXmlComment.firstChild 
-PASS detachedXmlComment.hasChildNodes() 
-PASS docfrag.nodeType 
-PASS docfrag.ownerDocument 
-PASS docfrag.childNodes.length 
-PASS docfrag.textContent 
-PASS docfrag.nodeName 
-PASS docfrag.nodeValue 
-PASS docfrag.nextSibling 
-PASS docfrag.previousSibling 
-PASS docfrag.parentElement 
-PASS docfrag.parentNode 
-PASS docfrag.lastChild 
-PASS docfrag.firstChild 
-PASS docfrag.hasChildNodes() 
-PASS foreignDocfrag.nodeType 
-PASS foreignDocfrag.ownerDocument 
-PASS foreignDocfrag.childNodes.length 
-PASS foreignDocfrag.textContent 
-PASS foreignDocfrag.nodeName 
-PASS foreignDocfrag.nodeValue 
-PASS foreignDocfrag.nextSibling 
-PASS foreignDocfrag.previousSibling 
-PASS foreignDocfrag.parentElement 
-PASS foreignDocfrag.parentNode 
-PASS foreignDocfrag.lastChild 
-PASS foreignDocfrag.firstChild 
-PASS foreignDocfrag.hasChildNodes() 
-PASS xmlDocfrag.nodeType 
-PASS xmlDocfrag.ownerDocument 
-PASS xmlDocfrag.childNodes.length 
-PASS xmlDocfrag.textContent 
-PASS xmlDocfrag.nodeName 
-PASS xmlDocfrag.nodeValue 
-PASS xmlDocfrag.nextSibling 
-PASS xmlDocfrag.previousSibling 
-PASS xmlDocfrag.parentElement 
-PASS xmlDocfrag.parentNode 
-PASS xmlDocfrag.lastChild 
-PASS xmlDocfrag.firstChild 
-PASS xmlDocfrag.hasChildNodes() 
-PASS doctype.nodeType 
-PASS doctype.ownerDocument 
-PASS doctype.parentNode 
-PASS doctype.previousSibling 
-PASS doctype.nextSibling 
-PASS doctype.name 
-PASS doctype.publicId 
-PASS doctype.systemId 
-PASS doctype.nodeName 
-PASS doctype.childNodes.length 
-PASS doctype.textContent 
-PASS doctype.nodeValue 
-PASS doctype.parentElement 
-PASS doctype.lastChild 
-PASS doctype.firstChild 
-PASS doctype.hasChildNodes() 
-PASS foreignDoctype.nodeType 
-PASS foreignDoctype.ownerDocument 
-PASS foreignDoctype.parentNode 
-PASS foreignDoctype.previousSibling 
-PASS foreignDoctype.nextSibling 
-PASS foreignDoctype.name 
-PASS foreignDoctype.publicId 
-PASS foreignDoctype.systemId 
-PASS foreignDoctype.nodeName 
-PASS foreignDoctype.childNodes.length 
-PASS foreignDoctype.textContent 
-PASS foreignDoctype.nodeValue 
-PASS foreignDoctype.parentElement 
-PASS foreignDoctype.lastChild 
-PASS foreignDoctype.firstChild 
-PASS foreignDoctype.hasChildNodes() 
-PASS xmlDoctype.nodeType 
-PASS xmlDoctype.ownerDocument 
-PASS xmlDoctype.parentNode 
-PASS xmlDoctype.previousSibling 
-PASS xmlDoctype.nextSibling 
-PASS xmlDoctype.name 
-PASS xmlDoctype.publicId 
-PASS xmlDoctype.systemId 
-PASS xmlDoctype.nodeName 
-PASS xmlDoctype.childNodes.length 
-PASS xmlDoctype.textContent 
-PASS xmlDoctype.nodeValue 
-PASS xmlDoctype.parentElement 
-PASS xmlDoctype.lastChild 
-PASS xmlDoctype.firstChild 
-PASS xmlDoctype.hasChildNodes() 
-PASS paras[0].nodeType 
-PASS paras[0].ownerDocument 
-PASS paras[0].parentNode 
-PASS paras[0].parentElement 
-PASS paras[0].childNodes.length 
-PASS paras[0].previousSibling 
-PASS paras[0].nextSibling 
-PASS paras[0].textContent 
-PASS paras[0].namespaceURI 
-PASS paras[0].prefix 
-PASS paras[0].localName 
-PASS paras[0].tagName 
-PASS paras[0].id 
-PASS paras[0].previousElementSibling 
-PASS paras[0].nextElementSibling 
-PASS paras[0].childElementCount 
-PASS paras[0].nodeName 
-PASS paras[0].nodeValue 
-PASS paras[0].children.length 
-PASS paras[0].className 
-PASS paras[0].lastElementChild 
-PASS paras[0].firstElementChild 
-PASS paras[0].firstChild 
-PASS paras[0].lastChild 
-PASS paras[0].hasChildNodes() 
-PASS paras[1].nodeType 
-PASS paras[1].ownerDocument 
-PASS paras[1].parentNode 
-PASS paras[1].parentElement 
-PASS paras[1].childNodes.length 
-PASS paras[1].previousSibling 
-PASS paras[1].nextSibling 
-PASS paras[1].textContent 
-PASS paras[1].namespaceURI 
-PASS paras[1].prefix 
-PASS paras[1].localName 
-PASS paras[1].tagName 
-PASS paras[1].id 
-PASS paras[1].previousElementSibling 
-PASS paras[1].nextElementSibling 
-PASS paras[1].childElementCount 
-PASS paras[1].nodeName 
-PASS paras[1].nodeValue 
-PASS paras[1].children.length 
-PASS paras[1].className 
-PASS paras[1].lastElementChild 
-PASS paras[1].firstElementChild 
-PASS paras[1].firstChild 
-PASS paras[1].lastChild 
-PASS paras[1].hasChildNodes() 
-PASS paras[2].nodeType 
-PASS paras[2].ownerDocument 
-PASS paras[2].parentNode 
-PASS paras[2].parentElement 
-PASS paras[2].childNodes.length 
-PASS paras[2].previousSibling 
-PASS paras[2].nextSibling 
-PASS paras[2].textContent 
-PASS paras[2].namespaceURI 
-PASS paras[2].prefix 
-PASS paras[2].localName 
-PASS paras[2].tagName 
-PASS paras[2].id 
-PASS paras[2].previousElementSibling 
-PASS paras[2].nextElementSibling 
-PASS paras[2].childElementCount 
-PASS paras[2].nodeName 
-PASS paras[2].nodeValue 
-PASS paras[2].children.length 
-PASS paras[2].className 
-PASS paras[2].lastElementChild 
-PASS paras[2].firstElementChild 
-PASS paras[2].firstChild 
-PASS paras[2].lastChild 
-PASS paras[2].hasChildNodes() 
-PASS paras[3].nodeType 
-PASS paras[3].ownerDocument 
-PASS paras[3].parentNode 
-PASS paras[3].parentElement 
-PASS paras[3].childNodes.length 
-PASS paras[3].previousSibling 
-PASS paras[3].nextSibling 
-PASS paras[3].textContent 
-PASS paras[3].namespaceURI 
-PASS paras[3].prefix 
-PASS paras[3].localName 
-PASS paras[3].tagName 
-PASS paras[3].id 
-PASS paras[3].previousElementSibling 
-PASS paras[3].nextElementSibling 
-PASS paras[3].childElementCount 
-PASS paras[3].nodeName 
-PASS paras[3].nodeValue 
-PASS paras[3].children.length 
-PASS paras[3].className 
-PASS paras[3].lastElementChild 
-PASS paras[3].firstElementChild 
-PASS paras[3].firstChild 
-PASS paras[3].lastChild 
-PASS paras[3].hasChildNodes() 
-PASS paras[4].nodeType 
-PASS paras[4].ownerDocument 
-PASS paras[4].parentNode 
-PASS paras[4].parentElement 
-PASS paras[4].childNodes.length 
-PASS paras[4].previousSibling 
-PASS paras[4].nextSibling 
-PASS paras[4].textContent 
-PASS paras[4].namespaceURI 
-PASS paras[4].prefix 
-PASS paras[4].localName 
-PASS paras[4].tagName 
-PASS paras[4].id 
-PASS paras[4].previousElementSibling 
-PASS paras[4].nextElementSibling 
-PASS paras[4].childElementCount 
-PASS paras[4].nodeName 
-PASS paras[4].nodeValue 
-PASS paras[4].children.length 
-PASS paras[4].className 
-PASS paras[4].lastElementChild 
-PASS paras[4].firstElementChild 
-PASS paras[4].firstChild 
-PASS paras[4].lastChild 
-PASS paras[4].hasChildNodes() 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-opaque-background-compositing-expected.html b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-opaque-background-compositing-expected.html
new file mode 100644
index 0000000..82ffe7365
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-opaque-background-compositing-expected.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<style>
+#myCanvas {                                                                        
+  width: 100%;                                                                
+  height: 100%;                                                               
+  background-color: rgb(241, 241, 241);                                       
+}
+</style>
+<head>
+  <link rel="stylesheet" type="text/css" href="canvas.css">
+</head>
+<body onload="load()">
+<canvas id="myCanvas"></canvas>
+<script>
+function load() {
+  var myCanvas = document.getElementById("myCanvas");
+  myCanvas.setAttribute("width", 400);
+  myCanvas.setAttribute("height", 400);
+  var ctx = myCanvas.getContext("2d");
+  offscreen2d.clearRect(0, 0, 400, 400);
+  offscreen2d.fillStyle = "green";
+  offscreen2d.fillRect(0, 0, 200, 200);
+  offscreen2d.commit();
+}
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-opaque-background-compositing.html b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-opaque-background-compositing.html
new file mode 100644
index 0000000..80447b9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-opaque-background-compositing.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<style>
+#myCanvas {                                                                        
+  width: 100%;                                                                
+  height: 100%;                                                               
+  background-color: rgb(241, 241, 241);                                       
+}
+</style>
+<head>
+  <link rel="stylesheet" type="text/css" href="canvas.css">
+</head>
+<body onload="load()">
+<canvas id="myCanvas"></canvas>
+<script>
+function load() {
+  var myCanvas = document.getElementById("myCanvas");
+  myCanvas.setAttribute("width", 400);
+  myCanvas.setAttribute("height", 400);
+  var offscreenCanvas = myCanvas.transferControlToOffscreen();
+  var offscreen2d = offscreenCanvas.getContext("2d");
+  offscreen2d.clearRect(0, 0, 400, 400);
+  offscreen2d.fillStyle = "green";
+  offscreen2d.fillRect(0, 0, 200, 200);
+  offscreen2d.commit();
+}
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null-expected.txt
index 5df2b39..1769da5 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null-expected.txt
@@ -1,7 +1,7 @@
 This test setting various attributes of documents to JavaScript null.
 
 TEST SUCCEEDED: Got the expected exception (9). [tested Document.xmlVersion]
-TEST SUCCEEDED: The value was null. [tested Document.documentURI]
+TEST SUCCEEDED: The value was the string 'about:blank'. [tested Document.documentURI]
 TEST SUCCEEDED: The value was the string 'UTF-8'. [tested Document.charset]
 TEST SUCCEEDED: The value was the string 'UTF-8'. [tested Document.characterSet]
 TEST SUCCEEDED: The value was the string 'UTF-8'. [tested Document.inputEncoding]
diff --git a/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null.html b/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null.html
index e9acb7e..3c617d0d 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null.html
+++ b/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null.html
@@ -67,7 +67,7 @@
                     docToUse: xmlDoc,
                     attributes: [
                         {name: 'xmlVersion', expectedExceptionCode: 9},
-                        {name: 'documentURI', expectedNull: null},
+                        {name: 'documentURI', expectedNull: 'about:blank'},
                         {name: 'charset', expectedNull: 'UTF-8'},
                         {name: 'characterSet', expectedNull: 'UTF-8'},
                         {name: 'inputEncoding', expectedNull: 'UTF-8'},
diff --git a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/calendar-picker-appearance-coarse.html b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/calendar-picker-appearance-coarse.html
new file mode 100644
index 0000000..11f140e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/calendar-picker-appearance-coarse.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+window.enablePixelTesting = true;
+</script>
+<script src="../../../resources/js-test.js"></script>
+<script src="../../forms/resources/picker-common.js"></script>
+<script src="resources/calendar-picker-common.js"></script>
+</head>
+<body>
+<input type=date id=date value="10000-12-31">
+<p id="description" style="opacity: 0"></p>
+<div id="console" style="opacity: 0"></div>
+<script>
+internals.settings.setAvailablePointerTypes('fine,coarse');
+internals.settings.setPrimaryPointerType('fine')
+openPicker(document.getElementById('date'), finishJSTest);
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/sources-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/sources-test.js
index 33e368f..880db90 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/sources-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/sources-test.js
@@ -47,7 +47,7 @@
         InspectorTest.addResult(text.split('\n').map(line => '    ' + line).join('\n'));
         InspectorTest.addResult('Outline:');
         for (var item of items)
-            InspectorTest.addResult('    ' + item.name + item.arguments + ':' + item.line + ':' + item.column);
+            InspectorTest.addResult('    ' + item.name + (item.arguments || '') + ':' + item.line + ':' + item.column);
         fulfill();
     }
 }
diff --git a/third_party/WebKit/LayoutTests/inspector/sha1-expected.txt b/third_party/WebKit/LayoutTests/inspector/sha1-expected.txt
new file mode 100644
index 0000000..4ac45d7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sha1-expected.txt
@@ -0,0 +1,9 @@
+Tests SHA-1 hashes.
+foobar : 8843d7f92416211de9ebb963ff4ce28125932878
+hello : aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
+abcdefghijklmnopqrstuvwxyz : 32d10c7b8cf96570ca04ce37f2a19d84240d3a89
+ABCDEFGHIJKLMNOPQRSTUVWXYZ : 80256f39a9d308650ac90d9be9a72a9562454574
+a : 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
+A : 6dcd4ce23d88e2ee9568ba546c007c63d9131c1b
+A1 : 1ffd4ba3eb9ffadf4db3c3ff4c1bbcf94a64cc59
+
diff --git a/third_party/WebKit/LayoutTests/inspector/sha1.html b/third_party/WebKit/LayoutTests/inspector/sha1.html
new file mode 100644
index 0000000..8c0e2425
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sha1.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<meta charset="utf8">
+<script src="../http/tests/inspector/inspector-test.js"></script>
+<script>
+
+function initialize_ProductRegistry() {
+    InspectorTest.preloadModule('product_registry');
+}
+
+function test()
+{
+    InspectorTest.addResult('foobar : ' + ProductRegistry.sha1('foobar'));
+    InspectorTest.addResult('hello : ' + ProductRegistry.sha1('hello'));
+    InspectorTest.addResult('abcdefghijklmnopqrstuvwxyz : ' + ProductRegistry.sha1('abcdefghijklmnopqrstuvwxyz'));
+    InspectorTest.addResult('ABCDEFGHIJKLMNOPQRSTUVWXYZ : ' + ProductRegistry.sha1('ABCDEFGHIJKLMNOPQRSTUVWXYZ'));
+    InspectorTest.addResult('a : ' + ProductRegistry.sha1('a'));
+    InspectorTest.addResult('A : ' + ProductRegistry.sha1('A'));
+    InspectorTest.addResult('A1 : ' + ProductRegistry.sha1('A1'));
+    InspectorTest.completeTest();
+}
+
+</script>
+</head>
+<body onload="runTest()">
+Tests SHA-1 hashes.
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger/script-extract-outline-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/debugger/script-extract-outline-expected.txt
deleted file mode 100644
index fe14f28..0000000
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger/script-extract-outline-expected.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-Tests the script outline extraction functionality.
-
-{
-    chunk : [
-        {
-            arguments : "(x, y)"
-            column : 9
-            line : 0
-            name : "first"
-        }
-        {
-            arguments : "(y, z)"
-            column : 14
-            line : 1
-            name : "second"
-        }
-        {
-            arguments : "(arg)"
-            column : 10
-            line : 4
-            name : "Object"
-        }
-        {
-            arguments : "(a, b, c, d, e, f)"
-            column : 40
-            line : 6
-            name : "functionOnPrototype"
-        }
-        {
-            arguments : "()"
-            column : 26
-            line : 8
-            name : "innerFunction1"
-        }
-        {
-            arguments : "(arg1, arg2)"
-            column : 22
-            line : 9
-            name : "innerFunction2"
-        }
-        {
-            arguments : "(name)"
-            column : 13
-            line : 14
-            name : "Cat"
-        }
-        {
-            arguments : "()"
-            column : 9
-            line : 20
-            name : "mew"
-        }
-        {
-            arguments : "()"
-            column : 8
-            line : 25
-            name : "get name"
-        }
-        {
-            arguments : "()"
-            column : 10
-            line : 30
-            name : "feed"
-        }
-        {
-            arguments : "(newName)"
-            column : 8
-            line : 35
-            name : "set name"
-        }
-    ]
-    isLastChunk : true
-}
-
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger/script-extract-outline.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger/script-extract-outline.html
deleted file mode 100644
index ff65e11..0000000
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger/script-extract-outline.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<html>
-<head>
-<script src="../../../http/tests/inspector/inspector-test.js"></script>
-<script src="resources/obfuscated.js"></script>
-
-<script id="outline">function first(x,y) { }
- var second = function(y 
- , 
-z) { }
- Object = function(arg) {
-}
- Object.prototype.functionOnPrototype = function  (  a,  b  ,  
-c,  d   ,  
-  e  ,  f )    { function innerFunction1() {
- var innerFunction2 = function(arg1,arg2) {} } }
-/**
- * @constructor
- * @param {string} name
- */
-window.Cat = function(name)
-{
-    this._name = name;
-}
-
-window.Cat.prototype = {
-    mew: function()
-    {
-        console.log("Mew!");
-    },
-
-    get name()
-    {
-        return this._name;
-    },
-
-    feed: function()
-    {
-        // noop
-    },
-
-    set name(newName)
-    {
-        this._name = newName;
-    }
-};
-</script>
-
-<script>
-
-function getScriptText()
-{
-    return document.querySelector("#outline").textContent;
-}
-
-function test()
-{
-
-    var worker = new Common.Worker("formatter_worker");
-
-    worker.onmessage = InspectorTest.safeWrap(function(event)
-    {
-        InspectorTest.addObject(event.data);
-        InspectorTest.completeTest();
-    });
-
-    worker.onerror = function(event)
-    {
-        InspectorTest.addResult("Error in worker: " + event.data);
-        InspectorTest.completeTest();
-    };
-
-    InspectorTest.evaluateInPage("getScriptText()", onScriptText);
-    function onScriptText(result)
-    {
-        worker.postMessage({ method: "javaScriptOutline", params: { content: result.value } });
-    }
-}
-
-</script>
-
-</head>
-
-<body onload="runTest()">
-<p>Tests the script outline extraction functionality.
-</p>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1-expected.txt
index 22a5e66..d2d0323 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1-expected.txt
@@ -17,18 +17,18 @@
 Text:
     var a = function(a,b) { }
 Outline:
-    a(a, b):0:8
+    a(a, b):0:4
 
 Running: testMultipleVariableDeclaration
 Text:
     var a = function(a,b) { }, b = function(c,d) { }
 Outline:
-    a(a, b):0:8
-    b(c, d):0:31
+    a(a, b):0:4
+    b(c, d):0:27
 
 Running: testObjectProperty
 Text:
     a.b.c = function(d, e) { }
 Outline:
-    c(d, e):0:8
+    c(d, e):0:0
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2-expected.txt
index b9f8333..b05c51c 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2-expected.txt
@@ -5,17 +5,19 @@
 Text:
     var a = function foo(...bar) { }
 Outline:
-    foo(...bar):0:17
+    a(...bar):0:4
 
 Running: testArrowFunction
 Text:
     var a = x => x + 2
 Outline:
+    a(x):0:4
 
 Running: testArrowFunctionWithMultipleArguments
 Text:
     var a = (x, y) => x + y
 Outline:
+    a(x, y):0:4
 
 Running: testInnerFunctions
 Text:
@@ -29,7 +31,7 @@
 Text:
     x = { run: function() { }, get count() { }, set count(value) { }}
 Outline:
-    run():0:11
+    run():0:6
     get count():0:31
     set count(value):0:48
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3-expected.txt
index c6994fd..0e94278 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3-expected.txt
@@ -5,24 +5,35 @@
 Text:
     class Test { constructor(foo, bar) { }}
 Outline:
+    class Test:0:6
+    constructor(foo, bar):0:13
 
 Running: testClassMethods
 Text:
     class Test { foo() {} bar() { }}
 Outline:
+    class Test:0:6
+    foo():0:13
+    bar():0:22
 
 Running: testAnonymousClass
 Text:
     var test = class { constructor(foo, bar) { }}
 Outline:
+    class test:0:4
+    constructor(foo, bar):0:19
 
 Running: testClassExtends
 Text:
     var A = class extends B { foo() { }}
 Outline:
+    class A:0:4
+    foo():0:26
 
 Running: testStaticMethod
 Text:
     class Test { static foo() { }}
 Outline:
+    class Test:0:6
+    static foo():0:20
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4-expected.txt
index 810ae02..d01f43c 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4-expected.txt
@@ -5,12 +5,19 @@
 Text:
     async function foo() { }
 Outline:
-    foo():0:15
+    async foo():0:15
+
+Running: testAsyncArrowFunction
+Text:
+    var sum = async (x, y) => x + y;
+Outline:
+    async sum(x, y):0:4
 
 Running: testGeneratorFunction
 Text:
     function* foo() { }
 Outline:
+    *foo():0:10
 
 Running: testMismatchBrackets
 Text:
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4.html b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4.html
index f40a8d4..f199794 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4.html
+++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4.html
@@ -12,6 +12,9 @@
     InspectorTest.markStep('testAsyncFunction');
     await test('async function foo() { }');
 
+    InspectorTest.markStep('testAsyncArrowFunction');
+    await test('var sum = async (x, y) => x + y;');
+
     InspectorTest.markStep('testGeneratorFunction');
     await test('function* foo() { }');
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-5-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-5-expected.txt
new file mode 100644
index 0000000..cb02b62
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-5-expected.txt
@@ -0,0 +1,30 @@
+Verify javascript outline
+
+
+Running: testComputedProperty
+Text:
+    a.b[c] = function() { };
+Outline:
+
+Running: testComputedPropertyInTheMiddle
+Text:
+    a.b[c].d = function() { };
+Outline:
+    d():0:0
+
+Running: testComputedPropertyForExpression
+Text:
+    (a || b).c = function() { };
+Outline:
+    c():0:0
+
+Running: testPropertyStringLiteral
+Text:
+    var foo = { "bar": function() { }}
+Outline:
+
+Running: testPropertyNumberLiteral
+Text:
+    var foo = { 42: function() { }}
+Outline:
+
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-5.html b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-5.html
new file mode 100644
index 0000000..c7632ea2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-5.html
@@ -0,0 +1,37 @@
+<html>
+<head>
+<script src="../../http/tests/inspector/inspector-test.js"></script>
+<script src="../../http/tests/inspector/sources-test.js"></script>
+
+<script>
+
+async function test()
+{
+    var test = InspectorTest.testJavascriptOutline;
+
+    InspectorTest.markStep('testComputedProperty');
+    await test('a.b[c] = function() { };');
+
+    InspectorTest.markStep('testComputedPropertyInTheMiddle');
+    await test('a.b[c].d = function() { };');
+
+    InspectorTest.markStep('testComputedPropertyForExpression');
+    await test('(a || b).c = function() { };');
+
+    InspectorTest.markStep('testPropertyStringLiteral');
+    await test('var foo = { "bar": function() { }}');
+
+    InspectorTest.markStep('testPropertyNumberLiteral');
+    await test('var foo = { 42: function() { }}');
+
+    InspectorTest.completeTest();
+}
+
+</script>
+
+</head>
+
+<body onload="runTest()">
+<p>Verify javascript outline</p>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-6-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-6-expected.txt
new file mode 100644
index 0000000..b936ab8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-6-expected.txt
@@ -0,0 +1,19 @@
+Verify javascript outline
+
+
+Running: testClassAsNumberLiteralProperty
+Text:
+    var foo = { 42: class { }};
+Outline:
+
+Running: testClassAsStringLiteralProperty
+Text:
+    var foo = { "foo": class { }};
+Outline:
+
+Running: testClassAsIdentifierProperty
+Text:
+    var foo = { foo: class { }};
+Outline:
+    class foo:0:12
+
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-6.html b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-6.html
new file mode 100644
index 0000000..59663aee
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-6.html
@@ -0,0 +1,31 @@
+<html>
+<head>
+<script src="../../http/tests/inspector/inspector-test.js"></script>
+<script src="../../http/tests/inspector/sources-test.js"></script>
+
+<script>
+
+async function test()
+{
+    var test = InspectorTest.testJavascriptOutline;
+
+    InspectorTest.markStep('testClassAsNumberLiteralProperty');
+    await test('var foo = { 42: class { }};');
+
+    InspectorTest.markStep('testClassAsStringLiteralProperty');
+    await test('var foo = { "foo": class { }};');
+
+    InspectorTest.markStep('testClassAsIdentifierProperty');
+    await test('var foo = { foo: class { }};');
+
+    InspectorTest.completeTest();
+}
+
+</script>
+
+</head>
+
+<body onload="runTest()">
+<p>Verify javascript outline</p>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/mojo/module-loading-manual-deps-loading.html b/third_party/WebKit/LayoutTests/mojo/module-loading-manual-deps-loading.html
new file mode 100644
index 0000000..74dad2d2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/mojo/module-loading-manual-deps-loading.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>Mojo JavaScript bindings module loading tests (manual mojom deps loading)</title>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="file:///gen/mojo/public/js/mojo_bindings.js"></script>
+<script>
+  mojoBindings.config.autoLoadMojomDeps = false;
+</script>
+<script src="file:///gen/mojo/public/interfaces/bindings/tests/echo.mojom.js"></script>
+<script src="file:///gen/mojo/public/interfaces/bindings/tests/echo_import.mojom.js"></script>
+<script>
+
+promise_test(async () => {
+  function EchoImpl() {}
+  EchoImpl.prototype.echoPoint = function(point) {
+    return Promise.resolve({result: point});
+  };
+
+  var echoServicePtr = new test.echo.mojom.EchoPtr();
+  var echoServiceBinding = new mojoBindings.Binding(
+      test.echo.mojom.Echo,
+      new EchoImpl(),
+      mojoBindings.makeRequest(echoServicePtr));
+  var result = (await echoServicePtr.echoPoint({x: 1, y: 2})).result;
+  assert_equals(1, result.x);
+  assert_equals(2, result.y);
+}, 'Basics');
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/mojo/module-loading.html b/third_party/WebKit/LayoutTests/mojo/module-loading.html
new file mode 100644
index 0000000..52eebeb5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/mojo/module-loading.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>Mojo JavaScript bindings module loading tests</title>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="file:///gen/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/mojo/public/interfaces/bindings/tests/echo.mojom.js"></script>
+<script>
+
+promise_test(async () => {
+  function EchoImpl() {}
+  EchoImpl.prototype.echoPoint = function(point) {
+    return Promise.resolve({result: point});
+  };
+
+  var echoServicePtr = new test.echo.mojom.EchoPtr();
+  var echoServiceBinding = new mojoBindings.Binding(
+      test.echo.mojom.Echo,
+      new EchoImpl(),
+      mojoBindings.makeRequest(echoServicePtr));
+  var result = (await echoServicePtr.echoPoint({x: 1, y: 2})).result;
+  assert_equals(1, result.x);
+  assert_equals(2, result.y);
+}, 'Basics');
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
index f91ca22..9d873cad 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
@@ -10,36 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 50, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [242, 251, 167, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [242, 51, 167, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [9, 251, 167, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [9, 51, 167, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [67, 251, 42, 67],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [67, 184, 42, 67],
-          "reason": "bounds change"
         }
       ]
     }
@@ -58,22 +28,6 @@
       "reason": "forced by layout"
     },
     {
-      "object": "LayoutSVGEllipse circle",
-      "reason": "bounds change"
-    },
-    {
-      "object": "LayoutSVGEllipse circle",
-      "reason": "bounds change"
-    },
-    {
-      "object": "LayoutSVGEllipse circle",
-      "reason": "bounds change"
-    },
-    {
-      "object": "LayoutSVGEllipse circle",
-      "reason": "bounds change"
-    },
-    {
       "object": "LayoutSVGContainer g",
       "reason": "bounds change"
     },
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/clip-path-child-changes-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/clip-path-child-changes-expected.txt
index 2af4a2e..7751825 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/clip-path-child-changes-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/clip-path-child-changes-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGContainer g",
           "rect": [0, 0, 200, 200],
           "reason": "full"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [0, 0, 200, 200],
-          "reason": "subtree"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/deep-dynamic-updates-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/deep-dynamic-updates-expected.txt
index a6122f8..d19b60dd 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/deep-dynamic-updates-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/deep-dynamic-updates-expected.txt
@@ -10,16 +10,6 @@
           "object": "LayoutSVGRect rect",
           "rect": [24, 24, 402, 402],
           "reason": "SVG resource change"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [-1, -1, 402, 402],
-          "reason": "SVG resource change"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [-1, -1, 123, 23],
-          "reason": "SVG resource change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-multiple-targets-id-change-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-multiple-targets-id-change-expected.txt
index c52f626..642975a 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-multiple-targets-id-change-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-multiple-targets-id-change-expected.txt
@@ -7,11 +7,6 @@
       "drawsContent": true,
       "paintInvalidations": [
         {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 0, 100, 100],
-          "reason": "full"
-        },
-        {
           "object": "LayoutSVGRect rect",
           "rect": [45, 0, 60, 110],
           "reason": "full"
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-expected.txt
index cedf322..097d598 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGRect rect",
           "rect": [0, 0, 110, 110],
           "reason": "full"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 0, 100, 100],
-          "reason": "full"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-with-use-indirection-2-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-with-use-indirection-2-expected.txt
index 82ea88e9..008556b 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-with-use-indirection-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-with-use-indirection-2-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGRect rect",
           "rect": [0, 0, 110, 110],
           "reason": "full"
-        },
-        {
-          "object": "LayoutSVGContainer use id='use'",
-          "rect": [0, 0, 100, 100],
-          "reason": "full"
         }
       ]
     }
@@ -25,10 +20,6 @@
       "reason": "full"
     },
     {
-      "object": "LayoutSVGRect rect id='rect'",
-      "reason": "bounds change"
-    },
-    {
       "object": "LayoutSVGResourceFilterPrimitive feImage id='feimage'",
       "reason": "full"
     },
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-with-use-indirection-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-with-use-indirection-expected.txt
index 8743d06..b68f4a1 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-with-use-indirection-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-attribute-change-with-use-indirection-expected.txt
@@ -12,16 +12,6 @@
           "reason": "full"
         },
         {
-          "object": "LayoutSVGContainer use id='use'",
-          "rect": [0, 0, 100, 100],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 0, 100, 100],
-          "reason": "full"
-        },
-        {
           "object": "LayoutSVGRect rect id='rect'",
           "rect": [0, 0, 1, 100],
           "reason": "layoutObject removal"
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-inline-style-change-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-inline-style-change-expected.txt
index 6753cb0b..edcac8e 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-inline-style-change-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-inline-style-change-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGRect rect",
           "rect": [0, 0, 110, 110],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 0, 100, 100],
-          "reason": "style change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-property-change-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-property-change-expected.txt
index cedf322..097d598 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-property-change-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-property-change-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGRect rect",
           "rect": [0, 0, 110, 110],
           "reason": "full"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 0, 100, 100],
-          "reason": "full"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-style-change-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-style-change-expected.txt
index 6753cb0b..edcac8e 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-style-change-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/feImage-target-style-change-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGRect rect",
           "rect": [0, 0, 110, 110],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 0, 100, 100],
-          "reason": "style change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/filter-refresh-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/filter-refresh-expected.txt
index 4b77133..20cde169 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/filter-refresh-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/filter-refresh-expected.txt
@@ -180,11 +180,6 @@
           "object": "LayoutSVGRect rect id='rect'",
           "rect": [10, 50, 30, 30],
           "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 10, 30, 30],
-          "reason": "style change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/image-with-clip-path-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/image-with-clip-path-expected.txt
index 952f7ba0..5d3c659 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/image-with-clip-path-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/image-with-clip-path-expected.txt
@@ -7,16 +7,6 @@
       "drawsContent": true,
       "paintInvalidations": [
         {
-          "object": "LayoutSVGRect rect id='r'",
-          "rect": [0, 0, 100, 100],
-          "reason": "subtree"
-        },
-        {
-          "object": "LayoutSVGRect rect id='r'",
-          "rect": [0, 0, 100, 100],
-          "reason": "subtree"
-        },
-        {
           "object": "LayoutSVGContainer g id='g'",
           "rect": [20, 20, 60, 60],
           "reason": "subtree"
@@ -32,11 +22,6 @@
           "reason": "subtree"
         },
         {
-          "object": "LayoutSVGRect rect id='r'",
-          "rect": [175, 25, 50, 50],
-          "reason": "subtree"
-        },
-        {
           "object": "LayoutSVGContainer g id='g'",
           "rect": [0, 0, 10, 10],
           "reason": "subtree"
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-marker-and-object-creation-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-marker-and-object-creation-expected.txt
index 1836b0e..d55ad6c 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-marker-and-object-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-marker-and-object-creation-expected.txt
@@ -20,11 +20,6 @@
           "object": "LayoutSVGContainer g id='content'",
           "rect": [203, 211, 111, 111],
           "reason": "became visible"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [0, 0, 4, 4],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-marker-creation-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-marker-creation-expected.txt
index 4174378b..6537907e 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-marker-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-marker-creation-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGPath path",
           "rect": [202, 211, 112, 112],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [0, 0, 4, 4],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-mask-and-object-creation-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-mask-and-object-creation-expected.txt
index 2c28e0f..c771b88 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-mask-and-object-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-mask-and-object-creation-expected.txt
@@ -7,11 +7,6 @@
       "drawsContent": true,
       "paintInvalidations": [
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [0, 0, 800, 300],
-          "reason": "layoutObject insertion"
-        },
-        {
           "object": "LayoutSVGContainer g id='content'",
           "rect": [0, 100, 800, 100],
           "reason": "became visible"
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-mask-creation-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-mask-creation-expected.txt
index ffd2f05..cc42e8e8 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-mask-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-late-mask-creation-expected.txt
@@ -8,11 +8,6 @@
       "paintInvalidations": [
         {
           "object": "LayoutSVGRect rect",
-          "rect": [0, 0, 800, 300],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
           "rect": [0, 100, 800, 100],
           "reason": "style change"
         }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-update-pattern-child-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-update-pattern-child-expected.txt
index 8cbbce6..d190cde98 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-update-pattern-child-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-update-pattern-child-expected.txt
@@ -15,16 +15,6 @@
           "object": "LayoutSVGRect rect",
           "rect": [10, 10, 430, 80],
           "reason": "SVG resource change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [10, 10, 10, 10],
-          "reason": "full"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 10, 10, 10],
-          "reason": "full"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-update-pattern-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-update-pattern-expected.txt
index 405f473..ff92cb44 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-update-pattern-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/js-update-pattern-expected.txt
@@ -15,16 +15,6 @@
           "object": "LayoutSVGRect rect",
           "rect": [10, 10, 430, 80],
           "reason": "SVG resource change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [10, 10, 10, 10],
-          "reason": "full"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 10, 10, 10],
-          "reason": "full"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-child-changes-css-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-child-changes-css-expected.txt
index 717a6b2..80d0ad6d 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-child-changes-css-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-child-changes-css-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGPath path",
           "rect": [121, 126, 68, 68],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 0, 2, 2],
-          "reason": "style change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-child-changes-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-child-changes-expected.txt
index 717a6b2..80d0ad6d 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-child-changes-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-child-changes-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGPath path",
           "rect": [121, 126, 68, 68],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 0, 2, 2],
-          "reason": "style change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-viewBox-changes-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-viewBox-changes-expected.txt
index 60536ef..e98bff5 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-viewBox-changes-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/marker-viewBox-changes-expected.txt
@@ -15,11 +15,6 @@
           "object": "LayoutSVGContainer g",
           "rect": [90, 95, 98, 98],
           "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [0, 0, 10, 10],
-          "reason": "bounds change"
         }
       ]
     }
@@ -30,10 +25,6 @@
       "reason": "full"
     },
     {
-      "object": "LayoutSVGRect rect",
-      "reason": "bounds change"
-    },
-    {
       "object": "LayoutSVGContainer g",
       "reason": "bounds change"
     },
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/mask-child-changes-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/mask-child-changes-expected.txt
index c33edd7c..e08f5e3 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/mask-child-changes-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/mask-child-changes-expected.txt
@@ -8,11 +8,6 @@
       "paintInvalidations": [
         {
           "object": "LayoutSVGRect rect",
-          "rect": [0, 0, 800, 300],
-          "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGRect rect",
           "rect": [0, 100, 800, 100],
           "reason": "style change"
         }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/mask-invalidation-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/mask-invalidation-expected.txt
index d2a0dd88..dda9be30d 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/mask-invalidation-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/mask-invalidation-expected.txt
@@ -7,16 +7,6 @@
       "drawsContent": true,
       "paintInvalidations": [
         {
-          "object": "LayoutSVGRect rect id='maskRect'",
-          "rect": [100, 100, 460, 316],
-          "reason": "subtree"
-        },
-        {
-          "object": "LayoutSVGRect rect id='maskRect'",
-          "rect": [50, 50, 460, 316],
-          "reason": "subtree"
-        },
-        {
           "object": "LayoutSVGContainer g id='root'",
           "rect": [50, 50, 453, 299],
           "reason": "bounds change"
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/paintorder-filtered-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/paintorder-filtered-expected.txt
index 7d259ef..315c9db 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/paintorder-filtered-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/paintorder-filtered-expected.txt
@@ -7,11 +7,6 @@
       "drawsContent": true,
       "paintInvalidations": [
         {
-          "object": "LayoutSVGPath polygon",
-          "rect": [137, 37, 581, 564],
-          "reason": "style change"
-        },
-        {
           "object": "LayoutSVGContainer use id='t2'",
           "rect": [181, 163, 138, 137],
           "reason": "style change"
@@ -45,11 +40,6 @@
           "object": "LayoutSVGPath polygon",
           "rect": [183, 165, 134, 134],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='t4'",
-          "rect": [46, 28, 7, 7],
-          "reason": "style change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/pending-resource-after-removal-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/pending-resource-after-removal-expected.txt
index 079cc154..33e1a6d1 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/pending-resource-after-removal-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/pending-resource-after-removal-expected.txt
@@ -9,16 +9,6 @@
         {
           "object": "LayoutSVGRect rect",
           "rect": [0, 0, 200, 200],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [0, 0, 200, 200],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [0, 0, 200, 200],
           "reason": "layoutObject removal"
         },
         {
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
index 070d67d4..dbc60a8 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
@@ -10,21 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 68, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGContainer use id='targetUse'",
-          "rect": [109, 169, 200, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='targetRect'",
-          "rect": [9, 169, 200, 200],
-          "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGContainer use id='targetUse'",
-          "rect": [34, 169, 50, 200],
-          "reason": "bounds change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
index a464f82..99de160 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
@@ -10,21 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 68, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGRect rect id='targetRect'",
-          "rect": [9, 269, 200, 200],
-          "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGContainer use id='targetUse'",
-          "rect": [9, 69, 200, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='targetRect1'",
-          "rect": [9, 69, 200, 200],
-          "reason": "forced by layout"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
index c8cf914..66af7f3a 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 50, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [16, 57, 136, 137],
-          "reason": "bounds change"
         }
       ]
     }
@@ -33,10 +28,6 @@
       "reason": "forced by layout"
     },
     {
-      "object": "LayoutSVGPath path",
-      "reason": "bounds change"
-    },
-    {
       "object": "LayoutSVGContainer use",
       "reason": "bounds change"
     },
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
index c8cf914..66af7f3a 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 50, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [16, 57, 136, 137],
-          "reason": "bounds change"
         }
       ]
     }
@@ -33,10 +28,6 @@
       "reason": "forced by layout"
     },
     {
-      "object": "LayoutSVGPath path",
-      "reason": "bounds change"
-    },
-    {
       "object": "LayoutSVGContainer use",
       "reason": "bounds change"
     },
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/repaint-paintorder-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/repaint-paintorder-expected.txt
index d8ba754..7cf4143b 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/repaint-paintorder-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/repaint-paintorder-expected.txt
@@ -8,11 +8,6 @@
       "paintInvalidations": [
         {
           "object": "LayoutSVGPath polygon",
-          "rect": [137, 37, 581, 564],
-          "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGPath polygon",
           "rect": [183, 165, 134, 134],
           "reason": "style change"
         },
@@ -40,11 +35,6 @@
           "object": "LayoutSVGContainer use id='t2'",
           "rect": [184, 166, 132, 132],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='t4'",
-          "rect": [46, 28, 7, 7],
-          "reason": "style change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/use-disappears-after-style-update-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/use-disappears-after-style-update-expected.txt
index 2e34e650..7553dfc1 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/use-disappears-after-style-update-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/use-disappears-after-style-update-expected.txt
@@ -25,11 +25,6 @@
           "object": "LayoutSVGRect rect id='rect'",
           "rect": [10, 10, 30, 30],
           "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGRect rect id='rect'",
-          "rect": [0, 10, 30, 30],
-          "reason": "style change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/use-setAttribute-crash-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/use-setAttribute-crash-expected.txt
index 0c86606..ce12cf96 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/use-setAttribute-crash-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/use-setAttribute-crash-expected.txt
@@ -18,11 +18,6 @@
         },
         {
           "object": "LayoutSVGEllipse svg:circle id='circle'",
-          "rect": [7, 7, 27, 27],
-          "reason": "subtree"
-        },
-        {
-          "object": "LayoutSVGEllipse svg:circle id='circle'",
           "rect": [52, 52, 12, 12],
           "reason": "layoutObject removal"
         },
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/window-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/window-expected.txt
index 14d7ba5..5c793569 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/window-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/window-expected.txt
@@ -250,36 +250,6 @@
           "object": "LayoutSVGPath line",
           "rect": [428, 388, 10, 2],
           "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGPath line",
-          "rect": [-1, 21, 7, 11],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGPath line",
-          "rect": [-1, 21, 7, 11],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [-1, 21, 7, 11],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGPath line",
-          "rect": [-1, 29, 6, 3],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [0, 22, 5, 9],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [0, 22, 5, 9],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
index 21fc1da4..ef4be30f 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
@@ -10,36 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 52, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [242, 253, 167, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [242, 53, 167, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [9, 253, 167, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [9, 53, 167, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [67, 253, 42, 67],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGEllipse circle",
-          "rect": [67, 186, 42, 67],
-          "reason": "bounds change"
         }
       ]
     }
@@ -58,22 +28,6 @@
       "reason": "forced by layout"
     },
     {
-      "object": "LayoutSVGEllipse circle",
-      "reason": "bounds change"
-    },
-    {
-      "object": "LayoutSVGEllipse circle",
-      "reason": "bounds change"
-    },
-    {
-      "object": "LayoutSVGEllipse circle",
-      "reason": "bounds change"
-    },
-    {
-      "object": "LayoutSVGEllipse circle",
-      "reason": "bounds change"
-    },
-    {
       "object": "LayoutSVGContainer g",
       "reason": "bounds change"
     },
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt
index e9a20fb..136e665 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt
@@ -15,11 +15,6 @@
           "object": "LayoutSVGContainer g id='content'",
           "rect": [16, 42, 784, 170],
           "reason": "became visible"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [0, 0, 334, 500],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-clipPath-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-clipPath-creation-expected.txt
index b6a18fe..441840f 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-clipPath-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-clipPath-creation-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGContainer g id='content'",
           "rect": [16, 42, 784, 170],
           "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [0, 0, 334, 500],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt
index 662f131db..21e5bf0 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt
@@ -15,26 +15,6 @@
           "object": "LayoutSVGText text",
           "rect": [0, 247, 681, 132],
           "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [16, 16, 18, 18],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [16, 16, 18, 18],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [8, 8, 17, 17],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [8, 8, 17, 17],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-pattern-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-pattern-creation-expected.txt
index 3a1826f..88686fa 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-pattern-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/js-late-pattern-creation-expected.txt
@@ -10,16 +10,6 @@
           "object": "LayoutSVGText text",
           "rect": [33, 23, 622, 194],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [16, 25, 18, 25],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [8, 12, 17, 26],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
index af8aa035..55988cb 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
@@ -10,21 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 72, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGContainer use id='targetUse'",
-          "rect": [109, 173, 200, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='targetRect'",
-          "rect": [9, 173, 200, 200],
-          "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGContainer use id='targetUse'",
-          "rect": [34, 173, 50, 200],
-          "reason": "bounds change"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
index fd4d193..21c645d 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
@@ -10,21 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 72, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGRect rect id='targetRect'",
-          "rect": [9, 273, 200, 200],
-          "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGContainer use id='targetUse'",
-          "rect": [9, 73, 200, 200],
-          "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGRect rect id='targetRect1'",
-          "rect": [9, 73, 200, 200],
-          "reason": "forced by layout"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
index 23c140b..24103ae 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 52, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [16, 59, 136, 137],
-          "reason": "bounds change"
         }
       ]
     }
@@ -33,10 +28,6 @@
       "reason": "forced by layout"
     },
     {
-      "object": "LayoutSVGPath path",
-      "reason": "bounds change"
-    },
-    {
       "object": "LayoutSVGContainer use",
       "reason": "bounds change"
     },
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
index 23c140b..24103ae 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutBlockFlow div id='contentBox'",
           "rect": [8, 52, 402, 402],
           "reason": "forced by layout"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [16, 59, 136, 137],
-          "reason": "bounds change"
         }
       ]
     }
@@ -33,10 +28,6 @@
       "reason": "forced by layout"
     },
     {
-      "object": "LayoutSVGPath path",
-      "reason": "bounds change"
-    },
-    {
       "object": "LayoutSVGContainer use",
       "reason": "bounds change"
     },
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/tabgroup-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/tabgroup-expected.txt
index d743df2..ed320ae 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/tabgroup-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/tabgroup-expected.txt
@@ -57,6 +57,11 @@
           "reason": "became visible"
         },
         {
+          "object": "LayoutSVGRect rect",
+          "rect": [30, 188, 240, 12],
+          "reason": "layoutObject removal"
+        },
+        {
           "object": "LayoutSVGPath path",
           "rect": [506, 233, 238, 159],
           "reason": "layoutObject insertion"
@@ -108,32 +113,32 @@
         },
         {
           "object": "LayoutSVGRect rect",
-          "rect": [31, 404, 188, 10],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [23, 146, 188, 10],
+          "rect": [39, 189, 222, 122],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGRect rect",
-          "rect": [30, 147, 175, 97],
+          "rect": [40, 188, 220, 122],
           "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [38, 405, 174, 96],
-          "reason": "layoutObject insertion"
+          "object": "LayoutSVGInlineText #text",
+          "rect": [10, 43, 192, 31],
+          "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [39, 404, 172, 96],
-          "reason": "layoutObject insertion"
+          "object": "LayoutSVGInlineText #text",
+          "rect": [10, 43, 192, 31],
+          "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [31, 146, 172, 96],
+          "object": "LayoutSVGTSpan tspan",
+          "rect": [10, 43, 192, 31],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGText text",
+          "rect": [10, 43, 192, 31],
           "reason": "layoutObject removal"
         },
         {
@@ -162,31 +167,6 @@
           "reason": "became visible"
         },
         {
-          "object": "LayoutSVGText text",
-          "rect": [15, 291, 151, 25],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [7, 33, 151, 25],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [7, 33, 151, 25],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGTSpan tspan",
-          "rect": [7, 33, 151, 25],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGText text",
-          "rect": [7, 33, 151, 25],
-          "reason": "layoutObject removal"
-        },
-        {
           "object": "LayoutSVGPath path id='tabgroupTriangle__1'",
           "rect": [61, 256, 67, 31],
           "reason": "layoutObject insertion"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/text-mask-update-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/text-mask-update-expected.txt
index 70fd2f4..c084de20 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/text-mask-update-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/text-mask-update-expected.txt
@@ -12,21 +12,11 @@
           "reason": "style change"
         },
         {
-          "object": "LayoutSVGText text id='text1'",
-          "rect": [10, 3, 46, 22],
-          "reason": "style change"
-        },
-        {
           "object": "LayoutSVGInlineText #text",
           "rect": [10, 33, 43, 22],
           "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGText text id='text2'",
-          "rect": [10, 33, 43, 22],
-          "reason": "full"
-        },
-        {
           "object": "LayoutSVGRect rect",
           "rect": [10, 33, 43, 17],
           "reason": "full"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/use-detach-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/use-detach-expected.txt
index 252f840..06b6bf1 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/use-detach-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/use-detach-expected.txt
@@ -24,31 +24,6 @@
         {
           "object": "LayoutSVGContainer use",
           "rect": [210, 58, 44, 38],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [210, 58, 44, 38],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [210, 58, 44, 38],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [210, 58, 44, 38],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [210, 58, 44, 38],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [210, 58, 44, 38],
           "reason": "layoutObject removal"
         },
         {
@@ -62,73 +37,83 @@
           "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGText text id='use_text'",
-          "rect": [210, 58, 44, 38],
+          "object": "LayoutSVGContainer use",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGEllipse circle id='use_circle'",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGEllipse circle id='use_circle'",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGEllipse circle id='use_circle'",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [40, 19, 20, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [40, 19, 20, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGInlineText #text",
+          "rect": [40, 19, 20, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGInlineText #text",
+          "rect": [40, 19, 20, 16],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGText text id='use_text'",
-          "rect": [210, 58, 44, 38],
+          "rect": [40, 19, 20, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGText text id='use_text'",
+          "rect": [40, 19, 20, 16],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         }
       ]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/use-setAttribute-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/use-setAttribute-crash-expected.txt
index d428deca..098372b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/use-setAttribute-crash-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/use-setAttribute-crash-expected.txt
@@ -18,11 +18,6 @@
         },
         {
           "object": "LayoutSVGEllipse svg:circle id='circle'",
-          "rect": [7, 7, 27, 27],
-          "reason": "subtree"
-        },
-        {
-          "object": "LayoutSVGEllipse svg:circle id='circle'",
           "rect": [52, 52, 12, 12],
           "reason": "layoutObject removal"
         },
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/external/wpt/dom/interfaces-expected.txt
deleted file mode 100644
index 53c250d..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/external/wpt/dom/interfaces-expected.txt
+++ /dev/null
@@ -1,1613 +0,0 @@
-This is a testharness.js-based test.
-Found 1609 tests; 1428 PASS, 181 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Event interface: existence and properties of interface object 
-PASS Event interface object length 
-PASS Event interface object name 
-FAIL Event interface: existence and properties of interface prototype object assert_equals: class string of Event.prototype expected "[object EventPrototype]" but got "[object Event]"
-PASS Event interface: existence and properties of interface prototype object's "constructor" property 
-PASS Event interface: attribute type 
-PASS Event interface: attribute target 
-PASS Event interface: attribute currentTarget 
-PASS Event interface: constant NONE on interface object 
-PASS Event interface: constant NONE on interface prototype object 
-PASS Event interface: constant CAPTURING_PHASE on interface object 
-PASS Event interface: constant CAPTURING_PHASE on interface prototype object 
-PASS Event interface: constant AT_TARGET on interface object 
-PASS Event interface: constant AT_TARGET on interface prototype object 
-PASS Event interface: constant BUBBLING_PHASE on interface object 
-PASS Event interface: constant BUBBLING_PHASE on interface prototype object 
-PASS Event interface: attribute eventPhase 
-PASS Event interface: operation stopPropagation() 
-PASS Event interface: operation stopImmediatePropagation() 
-PASS Event interface: attribute bubbles 
-PASS Event interface: attribute cancelable 
-PASS Event interface: operation preventDefault() 
-PASS Event interface: attribute defaultPrevented 
-PASS Event interface: attribute timeStamp 
-PASS Event interface: operation initEvent(DOMString,boolean,boolean) 
-PASS Event must be primary interface of document.createEvent("Event") 
-PASS Stringification of document.createEvent("Event") 
-PASS Event interface: document.createEvent("Event") must inherit property "type" with the proper type (0) 
-PASS Event interface: document.createEvent("Event") must inherit property "target" with the proper type (1) 
-PASS Event interface: document.createEvent("Event") must inherit property "currentTarget" with the proper type (2) 
-PASS Event interface: document.createEvent("Event") must inherit property "NONE" with the proper type (3) 
-PASS Event interface: document.createEvent("Event") must inherit property "CAPTURING_PHASE" with the proper type (4) 
-PASS Event interface: document.createEvent("Event") must inherit property "AT_TARGET" with the proper type (5) 
-PASS Event interface: document.createEvent("Event") must inherit property "BUBBLING_PHASE" with the proper type (6) 
-PASS Event interface: document.createEvent("Event") must inherit property "eventPhase" with the proper type (7) 
-PASS Event interface: document.createEvent("Event") must inherit property "stopPropagation" with the proper type (8) 
-PASS Event interface: document.createEvent("Event") must inherit property "stopImmediatePropagation" with the proper type (9) 
-PASS Event interface: document.createEvent("Event") must inherit property "bubbles" with the proper type (10) 
-PASS Event interface: document.createEvent("Event") must inherit property "cancelable" with the proper type (11) 
-PASS Event interface: document.createEvent("Event") must inherit property "preventDefault" with the proper type (12) 
-PASS Event interface: document.createEvent("Event") must inherit property "defaultPrevented" with the proper type (13) 
-PASS Event interface: document.createEvent("Event") must have own property "isTrusted" 
-PASS Event interface: document.createEvent("Event") must inherit property "timeStamp" with the proper type (15) 
-PASS Event interface: document.createEvent("Event") must inherit property "initEvent" with the proper type (16) 
-PASS Event interface: calling initEvent(DOMString,boolean,boolean) on document.createEvent("Event") with too few arguments must throw TypeError 
-PASS Event must be primary interface of new Event("foo") 
-PASS Stringification of new Event("foo") 
-PASS Event interface: new Event("foo") must inherit property "type" with the proper type (0) 
-PASS Event interface: new Event("foo") must inherit property "target" with the proper type (1) 
-PASS Event interface: new Event("foo") must inherit property "currentTarget" with the proper type (2) 
-PASS Event interface: new Event("foo") must inherit property "NONE" with the proper type (3) 
-PASS Event interface: new Event("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) 
-PASS Event interface: new Event("foo") must inherit property "AT_TARGET" with the proper type (5) 
-PASS Event interface: new Event("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) 
-PASS Event interface: new Event("foo") must inherit property "eventPhase" with the proper type (7) 
-PASS Event interface: new Event("foo") must inherit property "stopPropagation" with the proper type (8) 
-PASS Event interface: new Event("foo") must inherit property "stopImmediatePropagation" with the proper type (9) 
-PASS Event interface: new Event("foo") must inherit property "bubbles" with the proper type (10) 
-PASS Event interface: new Event("foo") must inherit property "cancelable" with the proper type (11) 
-PASS Event interface: new Event("foo") must inherit property "preventDefault" with the proper type (12) 
-PASS Event interface: new Event("foo") must inherit property "defaultPrevented" with the proper type (13) 
-PASS Event interface: new Event("foo") must have own property "isTrusted" 
-PASS Event interface: new Event("foo") must inherit property "timeStamp" with the proper type (15) 
-PASS Event interface: new Event("foo") must inherit property "initEvent" with the proper type (16) 
-PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new Event("foo") with too few arguments must throw TypeError 
-PASS CustomEvent interface: existence and properties of interface object 
-PASS CustomEvent interface object length 
-PASS CustomEvent interface object name 
-FAIL CustomEvent interface: existence and properties of interface prototype object assert_equals: class string of CustomEvent.prototype expected "[object CustomEventPrototype]" but got "[object CustomEvent]"
-PASS CustomEvent interface: existence and properties of interface prototype object's "constructor" property 
-PASS CustomEvent interface: attribute detail 
-PASS CustomEvent interface: operation initCustomEvent(DOMString,boolean,boolean,any) 
-PASS CustomEvent must be primary interface of new CustomEvent("foo") 
-PASS Stringification of new CustomEvent("foo") 
-PASS CustomEvent interface: new CustomEvent("foo") must inherit property "detail" with the proper type (0) 
-PASS CustomEvent interface: new CustomEvent("foo") must inherit property "initCustomEvent" with the proper type (1) 
-PASS CustomEvent interface: calling initCustomEvent(DOMString,boolean,boolean,any) on new CustomEvent("foo") with too few arguments must throw TypeError 
-PASS Event interface: new CustomEvent("foo") must inherit property "type" with the proper type (0) 
-PASS Event interface: new CustomEvent("foo") must inherit property "target" with the proper type (1) 
-PASS Event interface: new CustomEvent("foo") must inherit property "currentTarget" with the proper type (2) 
-PASS Event interface: new CustomEvent("foo") must inherit property "NONE" with the proper type (3) 
-PASS Event interface: new CustomEvent("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) 
-PASS Event interface: new CustomEvent("foo") must inherit property "AT_TARGET" with the proper type (5) 
-PASS Event interface: new CustomEvent("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) 
-PASS Event interface: new CustomEvent("foo") must inherit property "eventPhase" with the proper type (7) 
-PASS Event interface: new CustomEvent("foo") must inherit property "stopPropagation" with the proper type (8) 
-PASS Event interface: new CustomEvent("foo") must inherit property "stopImmediatePropagation" with the proper type (9) 
-PASS Event interface: new CustomEvent("foo") must inherit property "bubbles" with the proper type (10) 
-PASS Event interface: new CustomEvent("foo") must inherit property "cancelable" with the proper type (11) 
-PASS Event interface: new CustomEvent("foo") must inherit property "preventDefault" with the proper type (12) 
-PASS Event interface: new CustomEvent("foo") must inherit property "defaultPrevented" with the proper type (13) 
-PASS Event interface: new CustomEvent("foo") must have own property "isTrusted" 
-PASS Event interface: new CustomEvent("foo") must inherit property "timeStamp" with the proper type (15) 
-PASS Event interface: new CustomEvent("foo") must inherit property "initEvent" with the proper type (16) 
-PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new CustomEvent("foo") with too few arguments must throw TypeError 
-PASS EventTarget interface: existence and properties of interface object 
-PASS EventTarget interface object length 
-PASS EventTarget interface object name 
-FAIL EventTarget interface: existence and properties of interface prototype object assert_equals: class string of EventTarget.prototype expected "[object EventTargetPrototype]" but got "[object EventTarget]"
-PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property 
-PASS EventTarget interface: operation addEventListener(DOMString,EventListener,[object Object],[object Object]) 
-PASS EventTarget interface: operation removeEventListener(DOMString,EventListener,[object Object],[object Object]) 
-PASS EventTarget interface: operation dispatchEvent(Event) 
-PASS EventListener interface: existence and properties of interface object 
-PASS EventListener interface: existence and properties of interface prototype object 
-PASS EventListener interface: existence and properties of interface prototype object's "constructor" property 
-PASS EventListener interface: operation handleEvent(Event) 
-PASS NodeList interface: existence and properties of interface object 
-PASS NodeList interface object length 
-PASS NodeList interface object name 
-FAIL NodeList interface: existence and properties of interface prototype object assert_equals: class string of NodeList.prototype expected "[object NodeListPrototype]" but got "[object NodeList]"
-PASS NodeList interface: existence and properties of interface prototype object's "constructor" property 
-PASS NodeList interface: operation item(unsigned long) 
-PASS NodeList interface: attribute length 
-PASS NodeList must be primary interface of document.querySelectorAll("script") 
-PASS Stringification of document.querySelectorAll("script") 
-PASS NodeList interface: document.querySelectorAll("script") must inherit property "item" with the proper type (0) 
-PASS NodeList interface: calling item(unsigned long) on document.querySelectorAll("script") with too few arguments must throw TypeError 
-PASS NodeList interface: document.querySelectorAll("script") must inherit property "length" with the proper type (1) 
-PASS HTMLCollection interface: existence and properties of interface object 
-PASS HTMLCollection interface object length 
-PASS HTMLCollection interface object name 
-FAIL HTMLCollection interface: existence and properties of interface prototype object assert_equals: class string of HTMLCollection.prototype expected "[object HTMLCollectionPrototype]" but got "[object HTMLCollection]"
-PASS HTMLCollection interface: existence and properties of interface prototype object's "constructor" property 
-PASS HTMLCollection interface: attribute length 
-PASS HTMLCollection interface: operation item(unsigned long) 
-PASS HTMLCollection interface: operation namedItem(DOMString) 
-PASS HTMLCollection must be primary interface of document.body.children 
-PASS Stringification of document.body.children 
-PASS HTMLCollection interface: document.body.children must inherit property "length" with the proper type (0) 
-PASS HTMLCollection interface: document.body.children must inherit property "item" with the proper type (1) 
-PASS HTMLCollection interface: calling item(unsigned long) on document.body.children with too few arguments must throw TypeError 
-PASS HTMLCollection interface: document.body.children must inherit property "namedItem" with the proper type (2) 
-PASS HTMLCollection interface: calling namedItem(DOMString) on document.body.children with too few arguments must throw TypeError 
-PASS MutationObserver interface: existence and properties of interface object 
-PASS MutationObserver interface object length 
-PASS MutationObserver interface object name 
-FAIL MutationObserver interface: existence and properties of interface prototype object assert_equals: class string of MutationObserver.prototype expected "[object MutationObserverPrototype]" but got "[object MutationObserver]"
-PASS MutationObserver interface: existence and properties of interface prototype object's "constructor" property 
-PASS MutationObserver interface: operation observe(Node,MutationObserverInit) 
-PASS MutationObserver interface: operation disconnect() 
-PASS MutationObserver interface: operation takeRecords() 
-PASS MutationRecord interface: existence and properties of interface object 
-PASS MutationRecord interface object length 
-PASS MutationRecord interface object name 
-FAIL MutationRecord interface: existence and properties of interface prototype object assert_equals: class string of MutationRecord.prototype expected "[object MutationRecordPrototype]" but got "[object MutationRecord]"
-PASS MutationRecord interface: existence and properties of interface prototype object's "constructor" property 
-PASS MutationRecord interface: attribute type 
-PASS MutationRecord interface: attribute target 
-PASS MutationRecord interface: attribute addedNodes 
-PASS MutationRecord interface: attribute removedNodes 
-PASS MutationRecord interface: attribute previousSibling 
-PASS MutationRecord interface: attribute nextSibling 
-PASS MutationRecord interface: attribute attributeName 
-PASS MutationRecord interface: attribute attributeNamespace 
-PASS MutationRecord interface: attribute oldValue 
-PASS Node interface: existence and properties of interface object 
-PASS Node interface object length 
-PASS Node interface object name 
-FAIL Node interface: existence and properties of interface prototype object assert_equals: class string of Node.prototype expected "[object NodePrototype]" but got "[object Node]"
-PASS Node interface: existence and properties of interface prototype object's "constructor" property 
-PASS Node interface: constant ELEMENT_NODE on interface object 
-PASS Node interface: constant ELEMENT_NODE on interface prototype object 
-PASS Node interface: constant ATTRIBUTE_NODE on interface object 
-PASS Node interface: constant ATTRIBUTE_NODE on interface prototype object 
-PASS Node interface: constant TEXT_NODE on interface object 
-PASS Node interface: constant TEXT_NODE on interface prototype object 
-PASS Node interface: constant CDATA_SECTION_NODE on interface object 
-PASS Node interface: constant CDATA_SECTION_NODE on interface prototype object 
-PASS Node interface: constant ENTITY_REFERENCE_NODE on interface object 
-PASS Node interface: constant ENTITY_REFERENCE_NODE on interface prototype object 
-PASS Node interface: constant ENTITY_NODE on interface object 
-PASS Node interface: constant ENTITY_NODE on interface prototype object 
-PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface object 
-PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface prototype object 
-PASS Node interface: constant COMMENT_NODE on interface object 
-PASS Node interface: constant COMMENT_NODE on interface prototype object 
-PASS Node interface: constant DOCUMENT_NODE on interface object 
-PASS Node interface: constant DOCUMENT_NODE on interface prototype object 
-PASS Node interface: constant DOCUMENT_TYPE_NODE on interface object 
-PASS Node interface: constant DOCUMENT_TYPE_NODE on interface prototype object 
-PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface object 
-PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface prototype object 
-PASS Node interface: constant NOTATION_NODE on interface object 
-PASS Node interface: constant NOTATION_NODE on interface prototype object 
-PASS Node interface: attribute nodeType 
-PASS Node interface: attribute nodeName 
-PASS Node interface: attribute baseURI 
-PASS Node interface: attribute isConnected 
-PASS Node interface: attribute ownerDocument 
-PASS Node interface: operation getRootNode(GetRootNodeOptions) 
-PASS Node interface: attribute parentNode 
-PASS Node interface: attribute parentElement 
-PASS Node interface: operation hasChildNodes() 
-PASS Node interface: attribute childNodes 
-PASS Node interface: attribute firstChild 
-PASS Node interface: attribute lastChild 
-PASS Node interface: attribute previousSibling 
-PASS Node interface: attribute nextSibling 
-PASS Node interface: attribute nodeValue 
-PASS Node interface: attribute textContent 
-PASS Node interface: operation normalize() 
-PASS Node interface: operation cloneNode(boolean) 
-PASS Node interface: operation isEqualNode(Node) 
-PASS Node interface: operation isSameNode(Node) 
-PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface prototype object 
-PASS Node interface: operation compareDocumentPosition(Node) 
-PASS Node interface: operation contains(Node) 
-PASS Node interface: operation lookupPrefix(DOMString) 
-PASS Node interface: operation lookupNamespaceURI(DOMString) 
-PASS Node interface: operation isDefaultNamespace(DOMString) 
-PASS Node interface: operation insertBefore(Node,Node) 
-PASS Node interface: operation appendChild(Node) 
-PASS Node interface: operation replaceChild(Node,Node) 
-PASS Node interface: operation removeChild(Node) 
-PASS Document interface: existence and properties of interface object 
-PASS Document interface object length 
-PASS Document interface object name 
-FAIL Document interface: existence and properties of interface prototype object assert_equals: class string of Document.prototype expected "[object DocumentPrototype]" but got "[object Document]"
-PASS Document interface: existence and properties of interface prototype object's "constructor" property 
-PASS Document interface: attribute implementation 
-PASS Document interface: attribute URL 
-PASS Document interface: attribute documentURI 
-PASS Document interface: attribute origin 
-PASS Document interface: attribute compatMode 
-PASS Document interface: attribute characterSet 
-PASS Document interface: attribute charset 
-PASS Document interface: attribute inputEncoding 
-PASS Document interface: attribute contentType 
-PASS Document interface: attribute doctype 
-PASS Document interface: attribute documentElement 
-PASS Document interface: operation getElementsByTagName(DOMString) 
-PASS Document interface: operation getElementsByTagNameNS(DOMString,DOMString) 
-PASS Document interface: operation getElementsByClassName(DOMString) 
-PASS Document interface: operation createElement(DOMString,ElementCreationOptions) 
-PASS Document interface: operation createElementNS(DOMString,DOMString,ElementCreationOptions) 
-PASS Document interface: operation createDocumentFragment() 
-PASS Document interface: operation createTextNode(DOMString) 
-PASS Document interface: operation createCDATASection(DOMString) 
-PASS Document interface: operation createComment(DOMString) 
-PASS Document interface: operation createProcessingInstruction(DOMString,DOMString) 
-PASS Document interface: operation importNode(Node,boolean) 
-PASS Document interface: operation adoptNode(Node) 
-PASS Document interface: operation createAttribute(DOMString) 
-PASS Document interface: operation createAttributeNS(DOMString,DOMString) 
-PASS Document interface: operation createEvent(DOMString) 
-PASS Document interface: operation createRange() 
-PASS Document interface: operation createNodeIterator(Node,unsigned long,NodeFilter) 
-PASS Document interface: operation createTreeWalker(Node,unsigned long,NodeFilter) 
-PASS Document interface: operation getElementById(DOMString) 
-PASS Document interface: attribute children 
-PASS Document interface: attribute firstElementChild 
-PASS Document interface: attribute lastElementChild 
-PASS Document interface: attribute childElementCount 
-PASS Document interface: operation prepend([object Object],[object Object]) 
-PASS Document interface: operation append([object Object],[object Object]) 
-PASS Document interface: operation querySelector(DOMString) 
-PASS Document interface: operation querySelectorAll(DOMString) 
-FAIL Document must be primary interface of new Document() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Stringification of new Document() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "implementation" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "URL" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "documentURI" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "origin" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "compatMode" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "characterSet" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "charset" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "inputEncoding" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "contentType" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "doctype" with the proper type (9) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "documentElement" with the proper type (10) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementsByTagName" with the proper type (11) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementsByTagName(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementsByTagNameNS" with the proper type (12) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementsByClassName" with the proper type (13) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementsByClassName(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createElement" with the proper type (14) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createElement(DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createElementNS" with the proper type (15) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createDocumentFragment" with the proper type (16) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createTextNode" with the proper type (17) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createTextNode(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createCDATASection" with the proper type (18) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createCDATASection(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createComment" with the proper type (19) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createComment(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createProcessingInstruction" with the proper type (20) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createProcessingInstruction(DOMString,DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "importNode" with the proper type (21) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling importNode(Node,boolean) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "adoptNode" with the proper type (22) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling adoptNode(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createAttribute" with the proper type (23) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createAttribute(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createAttributeNS" with the proper type (24) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createAttributeNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createEvent" with the proper type (25) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createEvent(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createRange" with the proper type (26) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createNodeIterator" with the proper type (27) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createTreeWalker" with the proper type (28) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementById" with the proper type (29) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementById(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "children" with the proper type (30) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "firstElementChild" with the proper type (31) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "lastElementChild" with the proper type (32) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "childElementCount" with the proper type (33) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "prepend" with the proper type (34) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling prepend([object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "append" with the proper type (35) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling append([object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "querySelector" with the proper type (36) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling querySelector(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "querySelectorAll" with the proper type (37) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling querySelectorAll(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ELEMENT_NODE" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ATTRIBUTE_NODE" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "TEXT_NODE" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "CDATA_SECTION_NODE" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ENTITY_NODE" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "COMMENT_NODE" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_NODE" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "NOTATION_NODE" with the proper type (11) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nodeType" with the proper type (12) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nodeName" with the proper type (13) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "baseURI" with the proper type (14) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isConnected" with the proper type (15) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ownerDocument" with the proper type (16) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "getRootNode" with the proper type (17) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling getRootNode(GetRootNodeOptions) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "parentNode" with the proper type (18) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "parentElement" with the proper type (19) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "hasChildNodes" with the proper type (20) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "childNodes" with the proper type (21) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "firstChild" with the proper type (22) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "lastChild" with the proper type (23) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "previousSibling" with the proper type (24) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nextSibling" with the proper type (25) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nodeValue" with the proper type (26) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "textContent" with the proper type (27) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "normalize" with the proper type (28) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "cloneNode" with the proper type (29) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling cloneNode(boolean) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isEqualNode" with the proper type (30) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling isEqualNode(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isSameNode" with the proper type (31) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling isSameNode(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "compareDocumentPosition" with the proper type (38) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling compareDocumentPosition(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "contains" with the proper type (39) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling contains(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "lookupPrefix" with the proper type (40) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling lookupPrefix(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "lookupNamespaceURI" with the proper type (41) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling lookupNamespaceURI(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isDefaultNamespace" with the proper type (42) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling isDefaultNamespace(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "insertBefore" with the proper type (43) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling insertBefore(Node,Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "appendChild" with the proper type (44) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling appendChild(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "replaceChild" with the proper type (45) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling replaceChild(Node,Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "removeChild" with the proper type (46) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling removeChild(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new Document() must inherit property "addEventListener" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new Document() must inherit property "removeEventListener" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new Document() must inherit property "dispatchEvent" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: calling dispatchEvent(Event) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-PASS XMLDocument interface: existence and properties of interface object 
-PASS XMLDocument interface object length 
-PASS XMLDocument interface object name 
-FAIL XMLDocument interface: existence and properties of interface prototype object assert_equals: class string of XMLDocument.prototype expected "[object XMLDocumentPrototype]" but got "[object XMLDocument]"
-PASS XMLDocument interface: existence and properties of interface prototype object's "constructor" property 
-PASS XMLDocument must be primary interface of xmlDoc 
-PASS Stringification of xmlDoc 
-PASS Document interface: xmlDoc must inherit property "implementation" with the proper type (0) 
-PASS Document interface: xmlDoc must inherit property "URL" with the proper type (1) 
-FAIL Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) assert_equals: expected "string" but got "object"
-PASS Document interface: xmlDoc must inherit property "origin" with the proper type (3) 
-PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type (4) 
-PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type (5) 
-PASS Document interface: xmlDoc must inherit property "charset" with the proper type (6) 
-PASS Document interface: xmlDoc must inherit property "inputEncoding" with the proper type (7) 
-PASS Document interface: xmlDoc must inherit property "contentType" with the proper type (8) 
-PASS Document interface: xmlDoc must inherit property "doctype" with the proper type (9) 
-PASS Document interface: xmlDoc must inherit property "documentElement" with the proper type (10) 
-PASS Document interface: xmlDoc must inherit property "getElementsByTagName" with the proper type (11) 
-PASS Document interface: calling getElementsByTagName(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "getElementsByTagNameNS" with the proper type (12) 
-PASS Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "getElementsByClassName" with the proper type (13) 
-PASS Document interface: calling getElementsByClassName(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createElement" with the proper type (14) 
-PASS Document interface: calling createElement(DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createElementNS" with the proper type (15) 
-PASS Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createDocumentFragment" with the proper type (16) 
-PASS Document interface: xmlDoc must inherit property "createTextNode" with the proper type (17) 
-PASS Document interface: calling createTextNode(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createCDATASection" with the proper type (18) 
-PASS Document interface: calling createCDATASection(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createComment" with the proper type (19) 
-PASS Document interface: calling createComment(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createProcessingInstruction" with the proper type (20) 
-PASS Document interface: calling createProcessingInstruction(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "importNode" with the proper type (21) 
-PASS Document interface: calling importNode(Node,boolean) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "adoptNode" with the proper type (22) 
-PASS Document interface: calling adoptNode(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createAttribute" with the proper type (23) 
-PASS Document interface: calling createAttribute(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createAttributeNS" with the proper type (24) 
-PASS Document interface: calling createAttributeNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createEvent" with the proper type (25) 
-PASS Document interface: calling createEvent(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createRange" with the proper type (26) 
-PASS Document interface: xmlDoc must inherit property "createNodeIterator" with the proper type (27) 
-PASS Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createTreeWalker" with the proper type (28) 
-PASS Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "getElementById" with the proper type (29) 
-PASS Document interface: calling getElementById(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "children" with the proper type (30) 
-PASS Document interface: xmlDoc must inherit property "firstElementChild" with the proper type (31) 
-PASS Document interface: xmlDoc must inherit property "lastElementChild" with the proper type (32) 
-PASS Document interface: xmlDoc must inherit property "childElementCount" with the proper type (33) 
-PASS Document interface: xmlDoc must inherit property "prepend" with the proper type (34) 
-PASS Document interface: calling prepend([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "append" with the proper type (35) 
-PASS Document interface: calling append([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "querySelector" with the proper type (36) 
-PASS Document interface: calling querySelector(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "querySelectorAll" with the proper type (37) 
-PASS Document interface: calling querySelectorAll(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: xmlDoc must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: xmlDoc must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: xmlDoc must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: xmlDoc must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: xmlDoc must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: xmlDoc must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: xmlDoc must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: xmlDoc must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: xmlDoc must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: xmlDoc must inherit property "nodeName" with the proper type (13) 
-FAIL Node interface: xmlDoc must inherit property "baseURI" with the proper type (14) assert_equals: expected "string" but got "object"
-PASS Node interface: xmlDoc must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: xmlDoc must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: xmlDoc must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: xmlDoc must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: xmlDoc must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: xmlDoc must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: xmlDoc must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: xmlDoc must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: xmlDoc must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: xmlDoc must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: xmlDoc must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: xmlDoc must inherit property "textContent" with the proper type (27) 
-PASS Node interface: xmlDoc must inherit property "normalize" with the proper type (28) 
-PASS Node interface: xmlDoc must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: xmlDoc must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc with too few arguments must throw TypeError 
-PASS DOMImplementation interface: existence and properties of interface object 
-PASS DOMImplementation interface object length 
-PASS DOMImplementation interface object name 
-FAIL DOMImplementation interface: existence and properties of interface prototype object assert_equals: class string of DOMImplementation.prototype expected "[object DOMImplementationPrototype]" but got "[object DOMImplementation]"
-PASS DOMImplementation interface: existence and properties of interface prototype object's "constructor" property 
-PASS DOMImplementation interface: operation createDocumentType(DOMString,DOMString,DOMString) 
-PASS DOMImplementation interface: operation createDocument(DOMString,DOMString,DocumentType) 
-PASS DOMImplementation interface: operation createHTMLDocument(DOMString) 
-PASS DOMImplementation interface: operation hasFeature() 
-PASS DOMImplementation must be primary interface of document.implementation 
-PASS Stringification of document.implementation 
-PASS DOMImplementation interface: document.implementation must inherit property "createDocumentType" with the proper type (0) 
-PASS DOMImplementation interface: calling createDocumentType(DOMString,DOMString,DOMString) on document.implementation with too few arguments must throw TypeError 
-PASS DOMImplementation interface: document.implementation must inherit property "createDocument" with the proper type (1) 
-PASS DOMImplementation interface: calling createDocument(DOMString,DOMString,DocumentType) on document.implementation with too few arguments must throw TypeError 
-PASS DOMImplementation interface: document.implementation must inherit property "createHTMLDocument" with the proper type (2) 
-PASS DOMImplementation interface: calling createHTMLDocument(DOMString) on document.implementation with too few arguments must throw TypeError 
-PASS DOMImplementation interface: document.implementation must inherit property "hasFeature" with the proper type (3) 
-PASS DocumentType interface: existence and properties of interface object 
-PASS DocumentType interface object length 
-PASS DocumentType interface object name 
-FAIL DocumentType interface: existence and properties of interface prototype object assert_equals: class string of DocumentType.prototype expected "[object DocumentTypePrototype]" but got "[object DocumentType]"
-PASS DocumentType interface: existence and properties of interface prototype object's "constructor" property 
-PASS DocumentType interface: attribute name 
-PASS DocumentType interface: attribute publicId 
-PASS DocumentType interface: attribute systemId 
-PASS DocumentType interface: operation before([object Object],[object Object]) 
-PASS DocumentType interface: operation after([object Object],[object Object]) 
-PASS DocumentType interface: operation replaceWith([object Object],[object Object]) 
-PASS DocumentType interface: operation remove() 
-PASS DocumentType must be primary interface of document.doctype 
-PASS Stringification of document.doctype 
-PASS DocumentType interface: document.doctype must inherit property "name" with the proper type (0) 
-PASS DocumentType interface: document.doctype must inherit property "publicId" with the proper type (1) 
-PASS DocumentType interface: document.doctype must inherit property "systemId" with the proper type (2) 
-PASS DocumentType interface: document.doctype must inherit property "before" with the proper type (3) 
-PASS DocumentType interface: calling before([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentType interface: document.doctype must inherit property "after" with the proper type (4) 
-PASS DocumentType interface: calling after([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentType interface: document.doctype must inherit property "replaceWith" with the proper type (5) 
-PASS DocumentType interface: calling replaceWith([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentType interface: document.doctype must inherit property "remove" with the proper type (6) 
-PASS Node interface: document.doctype must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.doctype must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.doctype must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.doctype must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.doctype must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.doctype must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.doctype must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.doctype must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.doctype must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.doctype must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.doctype must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.doctype must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.doctype must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.doctype must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.doctype must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.doctype must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.doctype must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.doctype must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.doctype must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.doctype must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.doctype must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.doctype must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.doctype must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.doctype must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.doctype must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.doctype must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.doctype must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.doctype with too few arguments must throw TypeError 
-PASS EventTarget interface: document.doctype must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS EventTarget interface: document.doctype must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS EventTarget interface: document.doctype must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentFragment interface: existence and properties of interface object 
-PASS DocumentFragment interface object length 
-PASS DocumentFragment interface object name 
-FAIL DocumentFragment interface: existence and properties of interface prototype object assert_equals: class string of DocumentFragment.prototype expected "[object DocumentFragmentPrototype]" but got "[object DocumentFragment]"
-PASS DocumentFragment interface: existence and properties of interface prototype object's "constructor" property 
-PASS DocumentFragment interface: operation getElementById(DOMString) 
-PASS DocumentFragment interface: attribute children 
-PASS DocumentFragment interface: attribute firstElementChild 
-PASS DocumentFragment interface: attribute lastElementChild 
-PASS DocumentFragment interface: attribute childElementCount 
-PASS DocumentFragment interface: operation prepend([object Object],[object Object]) 
-PASS DocumentFragment interface: operation append([object Object],[object Object]) 
-PASS DocumentFragment interface: operation querySelector(DOMString) 
-PASS DocumentFragment interface: operation querySelectorAll(DOMString) 
-PASS DocumentFragment must be primary interface of document.createDocumentFragment() 
-PASS Stringification of document.createDocumentFragment() 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "getElementById" with the proper type (0) 
-PASS DocumentFragment interface: calling getElementById(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "children" with the proper type (1) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "firstElementChild" with the proper type (2) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "lastElementChild" with the proper type (3) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "childElementCount" with the proper type (4) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "prepend" with the proper type (5) 
-PASS DocumentFragment interface: calling prepend([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "append" with the proper type (6) 
-PASS DocumentFragment interface: calling append([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelector" with the proper type (7) 
-PASS DocumentFragment interface: calling querySelector(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelectorAll" with the proper type (8) 
-PASS DocumentFragment interface: calling querySelectorAll(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.createDocumentFragment() must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.createDocumentFragment() must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.createDocumentFragment() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.createDocumentFragment() must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.createDocumentFragment() must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.createDocumentFragment() must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.createDocumentFragment() must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.createDocumentFragment() must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.createDocumentFragment() must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.createDocumentFragment() must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.createDocumentFragment() must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.createDocumentFragment() must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.createDocumentFragment() must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.createDocumentFragment() must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.createDocumentFragment() must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.createDocumentFragment() must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.createDocumentFragment() must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.createDocumentFragment() must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createDocumentFragment() must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createDocumentFragment() must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createDocumentFragment() must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS ShadowRoot interface: existence and properties of interface object 
-PASS ShadowRoot interface object length 
-PASS ShadowRoot interface object name 
-FAIL ShadowRoot interface: existence and properties of interface prototype object assert_equals: class string of ShadowRoot.prototype expected "[object ShadowRootPrototype]" but got "[object ShadowRoot]"
-PASS ShadowRoot interface: existence and properties of interface prototype object's "constructor" property 
-PASS ShadowRoot interface: attribute mode 
-PASS ShadowRoot interface: attribute host 
-PASS Element interface: existence and properties of interface object 
-PASS Element interface object length 
-PASS Element interface object name 
-FAIL Element interface: existence and properties of interface prototype object assert_equals: class string of Element.prototype expected "[object ElementPrototype]" but got "[object Element]"
-PASS Element interface: existence and properties of interface prototype object's "constructor" property 
-PASS Element interface: attribute namespaceURI 
-PASS Element interface: attribute prefix 
-PASS Element interface: attribute localName 
-PASS Element interface: attribute tagName 
-PASS Element interface: attribute id 
-PASS Element interface: attribute className 
-PASS Element interface: attribute classList 
-PASS Element interface: attribute slot 
-PASS Element interface: operation hasAttributes() 
-PASS Element interface: attribute attributes 
-FAIL Element interface: operation getAttributeNames() assert_own_property: interface prototype object missing non-static operation expected property "getAttributeNames" missing
-PASS Element interface: operation getAttribute(DOMString) 
-PASS Element interface: operation getAttributeNS(DOMString,DOMString) 
-PASS Element interface: operation setAttribute(DOMString,DOMString) 
-PASS Element interface: operation setAttributeNS(DOMString,DOMString,DOMString) 
-PASS Element interface: operation removeAttribute(DOMString) 
-PASS Element interface: operation removeAttributeNS(DOMString,DOMString) 
-PASS Element interface: operation hasAttribute(DOMString) 
-PASS Element interface: operation hasAttributeNS(DOMString,DOMString) 
-PASS Element interface: operation getAttributeNode(DOMString) 
-PASS Element interface: operation getAttributeNodeNS(DOMString,DOMString) 
-PASS Element interface: operation setAttributeNode(Attr) 
-PASS Element interface: operation setAttributeNodeNS(Attr) 
-PASS Element interface: operation removeAttributeNode(Attr) 
-PASS Element interface: operation attachShadow(ShadowRootInit) 
-PASS Element interface: attribute shadowRoot 
-PASS Element interface: operation closest(DOMString) 
-PASS Element interface: operation matches(DOMString) 
-PASS Element interface: operation webkitMatchesSelector(DOMString) 
-PASS Element interface: operation getElementsByTagName(DOMString) 
-PASS Element interface: operation getElementsByTagNameNS(DOMString,DOMString) 
-PASS Element interface: operation getElementsByClassName(DOMString) 
-PASS Element interface: operation insertAdjacentElement(DOMString,Element) 
-PASS Element interface: operation insertAdjacentText(DOMString,DOMString) 
-PASS Element interface: attribute children 
-PASS Element interface: attribute firstElementChild 
-PASS Element interface: attribute lastElementChild 
-PASS Element interface: attribute childElementCount 
-PASS Element interface: operation prepend([object Object],[object Object]) 
-PASS Element interface: operation append([object Object],[object Object]) 
-PASS Element interface: operation querySelector(DOMString) 
-PASS Element interface: operation querySelectorAll(DOMString) 
-PASS Element interface: attribute previousElementSibling 
-PASS Element interface: attribute nextElementSibling 
-PASS Element interface: operation before([object Object],[object Object]) 
-PASS Element interface: operation after([object Object],[object Object]) 
-PASS Element interface: operation replaceWith([object Object],[object Object]) 
-PASS Element interface: operation remove() 
-PASS Element interface: attribute assignedSlot 
-PASS Element must be primary interface of element 
-PASS Stringification of element 
-PASS Element interface: element must inherit property "namespaceURI" with the proper type (0) 
-PASS Element interface: element must inherit property "prefix" with the proper type (1) 
-PASS Element interface: element must inherit property "localName" with the proper type (2) 
-PASS Element interface: element must inherit property "tagName" with the proper type (3) 
-PASS Element interface: element must inherit property "id" with the proper type (4) 
-PASS Element interface: element must inherit property "className" with the proper type (5) 
-PASS Element interface: element must inherit property "classList" with the proper type (6) 
-PASS Element interface: element must inherit property "slot" with the proper type (7) 
-PASS Element interface: element must inherit property "hasAttributes" with the proper type (8) 
-PASS Element interface: element must inherit property "attributes" with the proper type (9) 
-FAIL Element interface: element must inherit property "getAttributeNames" with the proper type (10) assert_inherits: property "getAttributeNames" not found in prototype chain
-PASS Element interface: element must inherit property "getAttribute" with the proper type (11) 
-PASS Element interface: calling getAttribute(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getAttributeNS" with the proper type (12) 
-PASS Element interface: calling getAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttribute" with the proper type (13) 
-PASS Element interface: calling setAttribute(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttributeNS" with the proper type (14) 
-PASS Element interface: calling setAttributeNS(DOMString,DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "removeAttribute" with the proper type (15) 
-PASS Element interface: calling removeAttribute(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "removeAttributeNS" with the proper type (16) 
-PASS Element interface: calling removeAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "hasAttribute" with the proper type (17) 
-PASS Element interface: calling hasAttribute(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "hasAttributeNS" with the proper type (18) 
-PASS Element interface: calling hasAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getAttributeNode" with the proper type (19) 
-PASS Element interface: calling getAttributeNode(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getAttributeNodeNS" with the proper type (20) 
-PASS Element interface: calling getAttributeNodeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttributeNode" with the proper type (21) 
-PASS Element interface: calling setAttributeNode(Attr) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttributeNodeNS" with the proper type (22) 
-PASS Element interface: calling setAttributeNodeNS(Attr) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "removeAttributeNode" with the proper type (23) 
-PASS Element interface: calling removeAttributeNode(Attr) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "attachShadow" with the proper type (24) 
-PASS Element interface: calling attachShadow(ShadowRootInit) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "shadowRoot" with the proper type (25) 
-PASS Element interface: element must inherit property "closest" with the proper type (26) 
-PASS Element interface: calling closest(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "matches" with the proper type (27) 
-PASS Element interface: calling matches(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "webkitMatchesSelector" with the proper type (28) 
-PASS Element interface: calling webkitMatchesSelector(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getElementsByTagName" with the proper type (29) 
-PASS Element interface: calling getElementsByTagName(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getElementsByTagNameNS" with the proper type (30) 
-PASS Element interface: calling getElementsByTagNameNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getElementsByClassName" with the proper type (31) 
-PASS Element interface: calling getElementsByClassName(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "insertAdjacentElement" with the proper type (32) 
-PASS Element interface: calling insertAdjacentElement(DOMString,Element) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "insertAdjacentText" with the proper type (33) 
-PASS Element interface: calling insertAdjacentText(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "children" with the proper type (34) 
-PASS Element interface: element must inherit property "firstElementChild" with the proper type (35) 
-PASS Element interface: element must inherit property "lastElementChild" with the proper type (36) 
-PASS Element interface: element must inherit property "childElementCount" with the proper type (37) 
-PASS Element interface: element must inherit property "prepend" with the proper type (38) 
-PASS Element interface: calling prepend([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "append" with the proper type (39) 
-PASS Element interface: calling append([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "querySelector" with the proper type (40) 
-PASS Element interface: calling querySelector(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "querySelectorAll" with the proper type (41) 
-PASS Element interface: calling querySelectorAll(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "previousElementSibling" with the proper type (42) 
-PASS Element interface: element must inherit property "nextElementSibling" with the proper type (43) 
-PASS Element interface: element must inherit property "before" with the proper type (44) 
-PASS Element interface: calling before([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "after" with the proper type (45) 
-PASS Element interface: calling after([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "replaceWith" with the proper type (46) 
-PASS Element interface: calling replaceWith([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "remove" with the proper type (47) 
-PASS Element interface: element must inherit property "assignedSlot" with the proper type (48) 
-PASS Node interface: element must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: element must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: element must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: element must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: element must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: element must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: element must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: element must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: element must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: element must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: element must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: element must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: element must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: element must inherit property "nodeName" with the proper type (13) 
-FAIL Node interface: element must inherit property "baseURI" with the proper type (14) assert_equals: expected "string" but got "object"
-PASS Node interface: element must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: element must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: element must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: element must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: element must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: element must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: element must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: element must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: element must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: element must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: element must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: element must inherit property "textContent" with the proper type (27) 
-PASS Node interface: element must inherit property "normalize" with the proper type (28) 
-PASS Node interface: element must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: element must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on element with too few arguments must throw TypeError 
-PASS EventTarget interface: element must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS EventTarget interface: element must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS EventTarget interface: element must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on element with too few arguments must throw TypeError 
-PASS NamedNodeMap interface: existence and properties of interface object 
-PASS NamedNodeMap interface object length 
-PASS NamedNodeMap interface object name 
-FAIL NamedNodeMap interface: existence and properties of interface prototype object assert_equals: class string of NamedNodeMap.prototype expected "[object NamedNodeMapPrototype]" but got "[object NamedNodeMap]"
-PASS NamedNodeMap interface: existence and properties of interface prototype object's "constructor" property 
-PASS NamedNodeMap interface: attribute length 
-PASS NamedNodeMap interface: operation item(unsigned long) 
-PASS NamedNodeMap interface: operation getNamedItem(DOMString) 
-PASS NamedNodeMap interface: operation getNamedItemNS(DOMString,DOMString) 
-PASS NamedNodeMap interface: operation setNamedItem(Attr) 
-PASS NamedNodeMap interface: operation setNamedItemNS(Attr) 
-PASS NamedNodeMap interface: operation removeNamedItem(DOMString) 
-PASS NamedNodeMap interface: operation removeNamedItemNS(DOMString,DOMString) 
-PASS Attr interface: existence and properties of interface object 
-PASS Attr interface object length 
-PASS Attr interface object name 
-FAIL Attr interface: existence and properties of interface prototype object assert_equals: class string of Attr.prototype expected "[object AttrPrototype]" but got "[object Attr]"
-PASS Attr interface: existence and properties of interface prototype object's "constructor" property 
-PASS Attr interface: attribute namespaceURI 
-PASS Attr interface: attribute prefix 
-PASS Attr interface: attribute localName 
-PASS Attr interface: attribute name 
-PASS Attr interface: attribute value 
-PASS Attr interface: attribute ownerElement 
-PASS Attr interface: attribute specified 
-PASS Attr must be primary interface of document.querySelector("[id]").attributes[0] 
-PASS Stringification of document.querySelector("[id]").attributes[0] 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "namespaceURI" with the proper type (0) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "prefix" with the proper type (1) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "localName" with the proper type (2) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "name" with the proper type (3) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "value" with the proper type (4) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "ownerElement" with the proper type (5) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "specified" with the proper type (6) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS CharacterData interface: existence and properties of interface object 
-PASS CharacterData interface object length 
-PASS CharacterData interface object name 
-FAIL CharacterData interface: existence and properties of interface prototype object assert_equals: class string of CharacterData.prototype expected "[object CharacterDataPrototype]" but got "[object CharacterData]"
-PASS CharacterData interface: existence and properties of interface prototype object's "constructor" property 
-PASS CharacterData interface: attribute data 
-PASS CharacterData interface: attribute length 
-PASS CharacterData interface: operation substringData(unsigned long,unsigned long) 
-PASS CharacterData interface: operation appendData(DOMString) 
-PASS CharacterData interface: operation insertData(unsigned long,DOMString) 
-PASS CharacterData interface: operation deleteData(unsigned long,unsigned long) 
-PASS CharacterData interface: operation replaceData(unsigned long,unsigned long,DOMString) 
-PASS CharacterData interface: attribute previousElementSibling 
-PASS CharacterData interface: attribute nextElementSibling 
-PASS CharacterData interface: operation before([object Object],[object Object]) 
-PASS CharacterData interface: operation after([object Object],[object Object]) 
-PASS CharacterData interface: operation replaceWith([object Object],[object Object]) 
-PASS CharacterData interface: operation remove() 
-PASS Text interface: existence and properties of interface object 
-PASS Text interface object length 
-PASS Text interface object name 
-FAIL Text interface: existence and properties of interface prototype object assert_equals: class string of Text.prototype expected "[object TextPrototype]" but got "[object Text]"
-PASS Text interface: existence and properties of interface prototype object's "constructor" property 
-PASS Text interface: operation splitText(unsigned long) 
-PASS Text interface: attribute wholeText 
-PASS Text interface: attribute assignedSlot 
-PASS Text must be primary interface of document.createTextNode("abc") 
-PASS Stringification of document.createTextNode("abc") 
-PASS Text interface: document.createTextNode("abc") must inherit property "splitText" with the proper type (0) 
-PASS Text interface: calling splitText(unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Text interface: document.createTextNode("abc") must inherit property "wholeText" with the proper type (1) 
-PASS Text interface: document.createTextNode("abc") must inherit property "assignedSlot" with the proper type (2) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "data" with the proper type (0) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "length" with the proper type (1) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "substringData" with the proper type (2) 
-PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "appendData" with the proper type (3) 
-PASS CharacterData interface: calling appendData(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "insertData" with the proper type (4) 
-PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "deleteData" with the proper type (5) 
-PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceData" with the proper type (6) 
-PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "previousElementSibling" with the proper type (7) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "nextElementSibling" with the proper type (8) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "before" with the proper type (9) 
-PASS CharacterData interface: calling before([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "after" with the proper type (10) 
-PASS CharacterData interface: calling after([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceWith" with the proper type (11) 
-PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "remove" with the proper type (12) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.createTextNode("abc") must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.createTextNode("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.createTextNode("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.createTextNode("abc") must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.createTextNode("abc") must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.createTextNode("abc") must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.createTextNode("abc") must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.createTextNode("abc") must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.createTextNode("abc") must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.createTextNode("abc") must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.createTextNode("abc") must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.createTextNode("abc") must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.createTextNode("abc") must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.createTextNode("abc") must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.createTextNode("abc") must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.createTextNode("abc") must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.createTextNode("abc") must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.createTextNode("abc") must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createTextNode("abc") must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createTextNode("abc") must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createTextNode("abc") must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CDATASection interface: existence and properties of interface object 
-PASS CDATASection interface object length 
-PASS CDATASection interface object name 
-FAIL CDATASection interface: existence and properties of interface prototype object assert_equals: class string of CDATASection.prototype expected "[object CDATASectionPrototype]" but got "[object CDATASection]"
-PASS CDATASection interface: existence and properties of interface prototype object's "constructor" property 
-PASS ProcessingInstruction interface: existence and properties of interface object 
-PASS ProcessingInstruction interface object length 
-PASS ProcessingInstruction interface object name 
-FAIL ProcessingInstruction interface: existence and properties of interface prototype object assert_equals: class string of ProcessingInstruction.prototype expected "[object ProcessingInstructionPrototype]" but got "[object ProcessingInstruction]"
-PASS ProcessingInstruction interface: existence and properties of interface prototype object's "constructor" property 
-PASS ProcessingInstruction interface: attribute target 
-PASS ProcessingInstruction must be primary interface of xmlDoc.createProcessingInstruction("abc", "def") 
-PASS Stringification of xmlDoc.createProcessingInstruction("abc", "def") 
-PASS ProcessingInstruction interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "target" with the proper type (0) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "data" with the proper type (0) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "length" with the proper type (1) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "substringData" with the proper type (2) 
-PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendData" with the proper type (3) 
-PASS CharacterData interface: calling appendData(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertData" with the proper type (4) 
-PASS CharacterData interface: calling insertData(unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "deleteData" with the proper type (5) 
-PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceData" with the proper type (6) 
-PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousElementSibling" with the proper type (7) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextElementSibling" with the proper type (8) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "before" with the proper type (9) 
-PASS CharacterData interface: calling before([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "after" with the proper type (10) 
-PASS CharacterData interface: calling after([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceWith" with the proper type (11) 
-PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "remove" with the proper type (12) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeName" with the proper type (13) 
-FAIL Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "baseURI" with the proper type (14) assert_equals: expected "string" but got "object"
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "textContent" with the proper type (27) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "normalize" with the proper type (28) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Comment interface: existence and properties of interface object 
-PASS Comment interface object length 
-PASS Comment interface object name 
-FAIL Comment interface: existence and properties of interface prototype object assert_equals: class string of Comment.prototype expected "[object CommentPrototype]" but got "[object Comment]"
-PASS Comment interface: existence and properties of interface prototype object's "constructor" property 
-PASS Comment must be primary interface of document.createComment("abc") 
-PASS Stringification of document.createComment("abc") 
-PASS CharacterData interface: document.createComment("abc") must inherit property "data" with the proper type (0) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "length" with the proper type (1) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "substringData" with the proper type (2) 
-PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "appendData" with the proper type (3) 
-PASS CharacterData interface: calling appendData(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "insertData" with the proper type (4) 
-PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "deleteData" with the proper type (5) 
-PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "replaceData" with the proper type (6) 
-PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "previousElementSibling" with the proper type (7) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "nextElementSibling" with the proper type (8) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "before" with the proper type (9) 
-PASS CharacterData interface: calling before([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "after" with the proper type (10) 
-PASS CharacterData interface: calling after([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "replaceWith" with the proper type (11) 
-PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "remove" with the proper type (12) 
-PASS Node interface: document.createComment("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.createComment("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.createComment("abc") must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.createComment("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.createComment("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.createComment("abc") must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.createComment("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.createComment("abc") must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.createComment("abc") must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.createComment("abc") must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.createComment("abc") must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.createComment("abc") must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.createComment("abc") must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.createComment("abc") must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.createComment("abc") must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.createComment("abc") must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.createComment("abc") must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.createComment("abc") must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.createComment("abc") must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.createComment("abc") must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.createComment("abc") must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.createComment("abc") must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.createComment("abc") must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.createComment("abc") must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.createComment("abc") must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.createComment("abc") must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.createComment("abc") must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createComment("abc") must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createComment("abc") must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createComment("abc") must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Range interface: existence and properties of interface object 
-PASS Range interface object length 
-PASS Range interface object name 
-FAIL Range interface: existence and properties of interface prototype object assert_equals: class string of Range.prototype expected "[object RangePrototype]" but got "[object Range]"
-PASS Range interface: existence and properties of interface prototype object's "constructor" property 
-PASS Range interface: attribute startContainer 
-PASS Range interface: attribute startOffset 
-PASS Range interface: attribute endContainer 
-PASS Range interface: attribute endOffset 
-PASS Range interface: attribute collapsed 
-PASS Range interface: attribute commonAncestorContainer 
-PASS Range interface: operation setStart(Node,unsigned long) 
-PASS Range interface: operation setEnd(Node,unsigned long) 
-PASS Range interface: operation setStartBefore(Node) 
-PASS Range interface: operation setStartAfter(Node) 
-PASS Range interface: operation setEndBefore(Node) 
-PASS Range interface: operation setEndAfter(Node) 
-PASS Range interface: operation collapse(boolean) 
-PASS Range interface: operation selectNode(Node) 
-PASS Range interface: operation selectNodeContents(Node) 
-PASS Range interface: constant START_TO_START on interface object 
-PASS Range interface: constant START_TO_START on interface prototype object 
-PASS Range interface: constant START_TO_END on interface object 
-PASS Range interface: constant START_TO_END on interface prototype object 
-PASS Range interface: constant END_TO_END on interface object 
-PASS Range interface: constant END_TO_END on interface prototype object 
-PASS Range interface: constant END_TO_START on interface object 
-PASS Range interface: constant END_TO_START on interface prototype object 
-PASS Range interface: operation compareBoundaryPoints(unsigned short,Range) 
-PASS Range interface: operation deleteContents() 
-PASS Range interface: operation extractContents() 
-PASS Range interface: operation cloneContents() 
-PASS Range interface: operation insertNode(Node) 
-PASS Range interface: operation surroundContents(Node) 
-PASS Range interface: operation cloneRange() 
-PASS Range interface: operation detach() 
-PASS Range interface: operation isPointInRange(Node,unsigned long) 
-PASS Range interface: operation comparePoint(Node,unsigned long) 
-PASS Range interface: operation intersectsNode(Node) 
-PASS Range interface: stringifier 
-PASS Range must be primary interface of document.createRange() 
-PASS Stringification of document.createRange() 
-PASS Range interface: document.createRange() must inherit property "startContainer" with the proper type (0) 
-PASS Range interface: document.createRange() must inherit property "startOffset" with the proper type (1) 
-PASS Range interface: document.createRange() must inherit property "endContainer" with the proper type (2) 
-PASS Range interface: document.createRange() must inherit property "endOffset" with the proper type (3) 
-PASS Range interface: document.createRange() must inherit property "collapsed" with the proper type (4) 
-PASS Range interface: document.createRange() must inherit property "commonAncestorContainer" with the proper type (5) 
-PASS Range interface: document.createRange() must inherit property "setStart" with the proper type (6) 
-PASS Range interface: calling setStart(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setEnd" with the proper type (7) 
-PASS Range interface: calling setEnd(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setStartBefore" with the proper type (8) 
-PASS Range interface: calling setStartBefore(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setStartAfter" with the proper type (9) 
-PASS Range interface: calling setStartAfter(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setEndBefore" with the proper type (10) 
-PASS Range interface: calling setEndBefore(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setEndAfter" with the proper type (11) 
-PASS Range interface: calling setEndAfter(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "collapse" with the proper type (12) 
-PASS Range interface: calling collapse(boolean) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "selectNode" with the proper type (13) 
-PASS Range interface: calling selectNode(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "selectNodeContents" with the proper type (14) 
-PASS Range interface: calling selectNodeContents(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "START_TO_START" with the proper type (15) 
-PASS Range interface: document.createRange() must inherit property "START_TO_END" with the proper type (16) 
-PASS Range interface: document.createRange() must inherit property "END_TO_END" with the proper type (17) 
-PASS Range interface: document.createRange() must inherit property "END_TO_START" with the proper type (18) 
-PASS Range interface: document.createRange() must inherit property "compareBoundaryPoints" with the proper type (19) 
-PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "deleteContents" with the proper type (20) 
-PASS Range interface: document.createRange() must inherit property "extractContents" with the proper type (21) 
-PASS Range interface: document.createRange() must inherit property "cloneContents" with the proper type (22) 
-PASS Range interface: document.createRange() must inherit property "insertNode" with the proper type (23) 
-PASS Range interface: calling insertNode(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "surroundContents" with the proper type (24) 
-PASS Range interface: calling surroundContents(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "cloneRange" with the proper type (25) 
-PASS Range interface: document.createRange() must inherit property "detach" with the proper type (26) 
-PASS Range interface: document.createRange() must inherit property "isPointInRange" with the proper type (27) 
-PASS Range interface: calling isPointInRange(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "comparePoint" with the proper type (28) 
-PASS Range interface: calling comparePoint(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "intersectsNode" with the proper type (29) 
-PASS Range interface: calling intersectsNode(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range must be primary interface of detachedRange 
-PASS Stringification of detachedRange 
-PASS Range interface: detachedRange must inherit property "startContainer" with the proper type (0) 
-PASS Range interface: detachedRange must inherit property "startOffset" with the proper type (1) 
-PASS Range interface: detachedRange must inherit property "endContainer" with the proper type (2) 
-PASS Range interface: detachedRange must inherit property "endOffset" with the proper type (3) 
-PASS Range interface: detachedRange must inherit property "collapsed" with the proper type (4) 
-PASS Range interface: detachedRange must inherit property "commonAncestorContainer" with the proper type (5) 
-PASS Range interface: detachedRange must inherit property "setStart" with the proper type (6) 
-PASS Range interface: calling setStart(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setEnd" with the proper type (7) 
-PASS Range interface: calling setEnd(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setStartBefore" with the proper type (8) 
-PASS Range interface: calling setStartBefore(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setStartAfter" with the proper type (9) 
-PASS Range interface: calling setStartAfter(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setEndBefore" with the proper type (10) 
-PASS Range interface: calling setEndBefore(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setEndAfter" with the proper type (11) 
-PASS Range interface: calling setEndAfter(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "collapse" with the proper type (12) 
-PASS Range interface: calling collapse(boolean) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "selectNode" with the proper type (13) 
-PASS Range interface: calling selectNode(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "selectNodeContents" with the proper type (14) 
-PASS Range interface: calling selectNodeContents(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "START_TO_START" with the proper type (15) 
-PASS Range interface: detachedRange must inherit property "START_TO_END" with the proper type (16) 
-PASS Range interface: detachedRange must inherit property "END_TO_END" with the proper type (17) 
-PASS Range interface: detachedRange must inherit property "END_TO_START" with the proper type (18) 
-PASS Range interface: detachedRange must inherit property "compareBoundaryPoints" with the proper type (19) 
-PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "deleteContents" with the proper type (20) 
-PASS Range interface: detachedRange must inherit property "extractContents" with the proper type (21) 
-PASS Range interface: detachedRange must inherit property "cloneContents" with the proper type (22) 
-PASS Range interface: detachedRange must inherit property "insertNode" with the proper type (23) 
-PASS Range interface: calling insertNode(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "surroundContents" with the proper type (24) 
-PASS Range interface: calling surroundContents(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "cloneRange" with the proper type (25) 
-PASS Range interface: detachedRange must inherit property "detach" with the proper type (26) 
-PASS Range interface: detachedRange must inherit property "isPointInRange" with the proper type (27) 
-PASS Range interface: calling isPointInRange(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "comparePoint" with the proper type (28) 
-PASS Range interface: calling comparePoint(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "intersectsNode" with the proper type (29) 
-PASS Range interface: calling intersectsNode(Node) on detachedRange with too few arguments must throw TypeError 
-PASS NodeIterator interface: existence and properties of interface object 
-PASS NodeIterator interface object length 
-PASS NodeIterator interface object name 
-FAIL NodeIterator interface: existence and properties of interface prototype object assert_equals: class string of NodeIterator.prototype expected "[object NodeIteratorPrototype]" but got "[object NodeIterator]"
-PASS NodeIterator interface: existence and properties of interface prototype object's "constructor" property 
-PASS NodeIterator interface: attribute root 
-PASS NodeIterator interface: attribute referenceNode 
-PASS NodeIterator interface: attribute pointerBeforeReferenceNode 
-PASS NodeIterator interface: attribute whatToShow 
-PASS NodeIterator interface: attribute filter 
-PASS NodeIterator interface: operation nextNode() 
-PASS NodeIterator interface: operation previousNode() 
-PASS NodeIterator interface: operation detach() 
-PASS NodeIterator must be primary interface of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS Stringification of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "referenceNode" with the proper type (1) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "pointerBeforeReferenceNode" with the proper type (2) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (3) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (4) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (5) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (6) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "detach" with the proper type (7) 
-PASS TreeWalker interface: existence and properties of interface object 
-PASS TreeWalker interface object length 
-PASS TreeWalker interface object name 
-FAIL TreeWalker interface: existence and properties of interface prototype object assert_equals: class string of TreeWalker.prototype expected "[object TreeWalkerPrototype]" but got "[object TreeWalker]"
-PASS TreeWalker interface: existence and properties of interface prototype object's "constructor" property 
-PASS TreeWalker interface: attribute root 
-PASS TreeWalker interface: attribute whatToShow 
-PASS TreeWalker interface: attribute filter 
-PASS TreeWalker interface: attribute currentNode 
-PASS TreeWalker interface: operation parentNode() 
-PASS TreeWalker interface: operation firstChild() 
-PASS TreeWalker interface: operation lastChild() 
-PASS TreeWalker interface: operation previousSibling() 
-PASS TreeWalker interface: operation nextSibling() 
-PASS TreeWalker interface: operation previousNode() 
-PASS TreeWalker interface: operation nextNode() 
-PASS TreeWalker must be primary interface of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS Stringification of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (1) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (2) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "currentNode" with the proper type (3) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "parentNode" with the proper type (4) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "firstChild" with the proper type (5) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "lastChild" with the proper type (6) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousSibling" with the proper type (7) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextSibling" with the proper type (8) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (9) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (10) 
-PASS NodeFilter interface: existence and properties of interface object 
-PASS NodeFilter interface object name 
-FAIL NodeFilter interface: existence and properties of interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-FAIL NodeFilter interface: existence and properties of interface prototype object's "constructor" property assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant FILTER_ACCEPT on interface object 
-FAIL NodeFilter interface: constant FILTER_ACCEPT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant FILTER_REJECT on interface object 
-FAIL NodeFilter interface: constant FILTER_REJECT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant FILTER_SKIP on interface object 
-FAIL NodeFilter interface: constant FILTER_SKIP on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ALL on interface object 
-FAIL NodeFilter interface: constant SHOW_ALL on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ELEMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_ELEMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ATTRIBUTE on interface object 
-FAIL NodeFilter interface: constant SHOW_ATTRIBUTE on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_TEXT on interface object 
-FAIL NodeFilter interface: constant SHOW_TEXT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_CDATA_SECTION on interface object 
-FAIL NodeFilter interface: constant SHOW_CDATA_SECTION on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface object 
-FAIL NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ENTITY on interface object 
-FAIL NodeFilter interface: constant SHOW_ENTITY on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface object 
-FAIL NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_COMMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_COMMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_DOCUMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_DOCUMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface object 
-FAIL NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_NOTATION on interface object 
-FAIL NodeFilter interface: constant SHOW_NOTATION on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-FAIL NodeFilter interface: operation acceptNode(Node) assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS DOMTokenList interface: existence and properties of interface object 
-PASS DOMTokenList interface object length 
-PASS DOMTokenList interface object name 
-FAIL DOMTokenList interface: existence and properties of interface prototype object assert_equals: class string of DOMTokenList.prototype expected "[object DOMTokenListPrototype]" but got "[object DOMTokenList]"
-PASS DOMTokenList interface: existence and properties of interface prototype object's "constructor" property 
-PASS DOMTokenList interface: attribute length 
-PASS DOMTokenList interface: operation item(unsigned long) 
-PASS DOMTokenList interface: operation contains(DOMString) 
-PASS DOMTokenList interface: operation add(DOMString) 
-PASS DOMTokenList interface: operation remove(DOMString) 
-PASS DOMTokenList interface: operation toggle(DOMString,boolean) 
-FAIL DOMTokenList interface: operation replace(DOMString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "replace" missing
-PASS DOMTokenList interface: operation supports(DOMString) 
-PASS DOMTokenList interface: attribute value 
-PASS DOMTokenList interface: stringifier 
-PASS DOMTokenList must be primary interface of document.body.classList 
-PASS Stringification of document.body.classList 
-PASS DOMTokenList interface: document.body.classList must inherit property "length" with the proper type (0) 
-PASS DOMTokenList interface: document.body.classList must inherit property "item" with the proper type (1) 
-PASS DOMTokenList interface: calling item(unsigned long) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "contains" with the proper type (2) 
-PASS DOMTokenList interface: calling contains(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "add" with the proper type (3) 
-PASS DOMTokenList interface: calling add(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "remove" with the proper type (4) 
-PASS DOMTokenList interface: calling remove(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "toggle" with the proper type (5) 
-PASS DOMTokenList interface: calling toggle(DOMString,boolean) on document.body.classList with too few arguments must throw TypeError 
-FAIL DOMTokenList interface: document.body.classList must inherit property "replace" with the proper type (6) assert_inherits: property "replace" not found in prototype chain
-FAIL DOMTokenList interface: calling replace(DOMString,DOMString) on document.body.classList with too few arguments must throw TypeError assert_inherits: property "replace" not found in prototype chain
-PASS DOMTokenList interface: document.body.classList must inherit property "supports" with the proper type (7) 
-PASS DOMTokenList interface: calling supports(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "value" with the proper type (8) 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-retina/external/wpt/dom/interfaces-expected.txt
deleted file mode 100644
index 53c250d..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-retina/external/wpt/dom/interfaces-expected.txt
+++ /dev/null
@@ -1,1613 +0,0 @@
-This is a testharness.js-based test.
-Found 1609 tests; 1428 PASS, 181 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Event interface: existence and properties of interface object 
-PASS Event interface object length 
-PASS Event interface object name 
-FAIL Event interface: existence and properties of interface prototype object assert_equals: class string of Event.prototype expected "[object EventPrototype]" but got "[object Event]"
-PASS Event interface: existence and properties of interface prototype object's "constructor" property 
-PASS Event interface: attribute type 
-PASS Event interface: attribute target 
-PASS Event interface: attribute currentTarget 
-PASS Event interface: constant NONE on interface object 
-PASS Event interface: constant NONE on interface prototype object 
-PASS Event interface: constant CAPTURING_PHASE on interface object 
-PASS Event interface: constant CAPTURING_PHASE on interface prototype object 
-PASS Event interface: constant AT_TARGET on interface object 
-PASS Event interface: constant AT_TARGET on interface prototype object 
-PASS Event interface: constant BUBBLING_PHASE on interface object 
-PASS Event interface: constant BUBBLING_PHASE on interface prototype object 
-PASS Event interface: attribute eventPhase 
-PASS Event interface: operation stopPropagation() 
-PASS Event interface: operation stopImmediatePropagation() 
-PASS Event interface: attribute bubbles 
-PASS Event interface: attribute cancelable 
-PASS Event interface: operation preventDefault() 
-PASS Event interface: attribute defaultPrevented 
-PASS Event interface: attribute timeStamp 
-PASS Event interface: operation initEvent(DOMString,boolean,boolean) 
-PASS Event must be primary interface of document.createEvent("Event") 
-PASS Stringification of document.createEvent("Event") 
-PASS Event interface: document.createEvent("Event") must inherit property "type" with the proper type (0) 
-PASS Event interface: document.createEvent("Event") must inherit property "target" with the proper type (1) 
-PASS Event interface: document.createEvent("Event") must inherit property "currentTarget" with the proper type (2) 
-PASS Event interface: document.createEvent("Event") must inherit property "NONE" with the proper type (3) 
-PASS Event interface: document.createEvent("Event") must inherit property "CAPTURING_PHASE" with the proper type (4) 
-PASS Event interface: document.createEvent("Event") must inherit property "AT_TARGET" with the proper type (5) 
-PASS Event interface: document.createEvent("Event") must inherit property "BUBBLING_PHASE" with the proper type (6) 
-PASS Event interface: document.createEvent("Event") must inherit property "eventPhase" with the proper type (7) 
-PASS Event interface: document.createEvent("Event") must inherit property "stopPropagation" with the proper type (8) 
-PASS Event interface: document.createEvent("Event") must inherit property "stopImmediatePropagation" with the proper type (9) 
-PASS Event interface: document.createEvent("Event") must inherit property "bubbles" with the proper type (10) 
-PASS Event interface: document.createEvent("Event") must inherit property "cancelable" with the proper type (11) 
-PASS Event interface: document.createEvent("Event") must inherit property "preventDefault" with the proper type (12) 
-PASS Event interface: document.createEvent("Event") must inherit property "defaultPrevented" with the proper type (13) 
-PASS Event interface: document.createEvent("Event") must have own property "isTrusted" 
-PASS Event interface: document.createEvent("Event") must inherit property "timeStamp" with the proper type (15) 
-PASS Event interface: document.createEvent("Event") must inherit property "initEvent" with the proper type (16) 
-PASS Event interface: calling initEvent(DOMString,boolean,boolean) on document.createEvent("Event") with too few arguments must throw TypeError 
-PASS Event must be primary interface of new Event("foo") 
-PASS Stringification of new Event("foo") 
-PASS Event interface: new Event("foo") must inherit property "type" with the proper type (0) 
-PASS Event interface: new Event("foo") must inherit property "target" with the proper type (1) 
-PASS Event interface: new Event("foo") must inherit property "currentTarget" with the proper type (2) 
-PASS Event interface: new Event("foo") must inherit property "NONE" with the proper type (3) 
-PASS Event interface: new Event("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) 
-PASS Event interface: new Event("foo") must inherit property "AT_TARGET" with the proper type (5) 
-PASS Event interface: new Event("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) 
-PASS Event interface: new Event("foo") must inherit property "eventPhase" with the proper type (7) 
-PASS Event interface: new Event("foo") must inherit property "stopPropagation" with the proper type (8) 
-PASS Event interface: new Event("foo") must inherit property "stopImmediatePropagation" with the proper type (9) 
-PASS Event interface: new Event("foo") must inherit property "bubbles" with the proper type (10) 
-PASS Event interface: new Event("foo") must inherit property "cancelable" with the proper type (11) 
-PASS Event interface: new Event("foo") must inherit property "preventDefault" with the proper type (12) 
-PASS Event interface: new Event("foo") must inherit property "defaultPrevented" with the proper type (13) 
-PASS Event interface: new Event("foo") must have own property "isTrusted" 
-PASS Event interface: new Event("foo") must inherit property "timeStamp" with the proper type (15) 
-PASS Event interface: new Event("foo") must inherit property "initEvent" with the proper type (16) 
-PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new Event("foo") with too few arguments must throw TypeError 
-PASS CustomEvent interface: existence and properties of interface object 
-PASS CustomEvent interface object length 
-PASS CustomEvent interface object name 
-FAIL CustomEvent interface: existence and properties of interface prototype object assert_equals: class string of CustomEvent.prototype expected "[object CustomEventPrototype]" but got "[object CustomEvent]"
-PASS CustomEvent interface: existence and properties of interface prototype object's "constructor" property 
-PASS CustomEvent interface: attribute detail 
-PASS CustomEvent interface: operation initCustomEvent(DOMString,boolean,boolean,any) 
-PASS CustomEvent must be primary interface of new CustomEvent("foo") 
-PASS Stringification of new CustomEvent("foo") 
-PASS CustomEvent interface: new CustomEvent("foo") must inherit property "detail" with the proper type (0) 
-PASS CustomEvent interface: new CustomEvent("foo") must inherit property "initCustomEvent" with the proper type (1) 
-PASS CustomEvent interface: calling initCustomEvent(DOMString,boolean,boolean,any) on new CustomEvent("foo") with too few arguments must throw TypeError 
-PASS Event interface: new CustomEvent("foo") must inherit property "type" with the proper type (0) 
-PASS Event interface: new CustomEvent("foo") must inherit property "target" with the proper type (1) 
-PASS Event interface: new CustomEvent("foo") must inherit property "currentTarget" with the proper type (2) 
-PASS Event interface: new CustomEvent("foo") must inherit property "NONE" with the proper type (3) 
-PASS Event interface: new CustomEvent("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) 
-PASS Event interface: new CustomEvent("foo") must inherit property "AT_TARGET" with the proper type (5) 
-PASS Event interface: new CustomEvent("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) 
-PASS Event interface: new CustomEvent("foo") must inherit property "eventPhase" with the proper type (7) 
-PASS Event interface: new CustomEvent("foo") must inherit property "stopPropagation" with the proper type (8) 
-PASS Event interface: new CustomEvent("foo") must inherit property "stopImmediatePropagation" with the proper type (9) 
-PASS Event interface: new CustomEvent("foo") must inherit property "bubbles" with the proper type (10) 
-PASS Event interface: new CustomEvent("foo") must inherit property "cancelable" with the proper type (11) 
-PASS Event interface: new CustomEvent("foo") must inherit property "preventDefault" with the proper type (12) 
-PASS Event interface: new CustomEvent("foo") must inherit property "defaultPrevented" with the proper type (13) 
-PASS Event interface: new CustomEvent("foo") must have own property "isTrusted" 
-PASS Event interface: new CustomEvent("foo") must inherit property "timeStamp" with the proper type (15) 
-PASS Event interface: new CustomEvent("foo") must inherit property "initEvent" with the proper type (16) 
-PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new CustomEvent("foo") with too few arguments must throw TypeError 
-PASS EventTarget interface: existence and properties of interface object 
-PASS EventTarget interface object length 
-PASS EventTarget interface object name 
-FAIL EventTarget interface: existence and properties of interface prototype object assert_equals: class string of EventTarget.prototype expected "[object EventTargetPrototype]" but got "[object EventTarget]"
-PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property 
-PASS EventTarget interface: operation addEventListener(DOMString,EventListener,[object Object],[object Object]) 
-PASS EventTarget interface: operation removeEventListener(DOMString,EventListener,[object Object],[object Object]) 
-PASS EventTarget interface: operation dispatchEvent(Event) 
-PASS EventListener interface: existence and properties of interface object 
-PASS EventListener interface: existence and properties of interface prototype object 
-PASS EventListener interface: existence and properties of interface prototype object's "constructor" property 
-PASS EventListener interface: operation handleEvent(Event) 
-PASS NodeList interface: existence and properties of interface object 
-PASS NodeList interface object length 
-PASS NodeList interface object name 
-FAIL NodeList interface: existence and properties of interface prototype object assert_equals: class string of NodeList.prototype expected "[object NodeListPrototype]" but got "[object NodeList]"
-PASS NodeList interface: existence and properties of interface prototype object's "constructor" property 
-PASS NodeList interface: operation item(unsigned long) 
-PASS NodeList interface: attribute length 
-PASS NodeList must be primary interface of document.querySelectorAll("script") 
-PASS Stringification of document.querySelectorAll("script") 
-PASS NodeList interface: document.querySelectorAll("script") must inherit property "item" with the proper type (0) 
-PASS NodeList interface: calling item(unsigned long) on document.querySelectorAll("script") with too few arguments must throw TypeError 
-PASS NodeList interface: document.querySelectorAll("script") must inherit property "length" with the proper type (1) 
-PASS HTMLCollection interface: existence and properties of interface object 
-PASS HTMLCollection interface object length 
-PASS HTMLCollection interface object name 
-FAIL HTMLCollection interface: existence and properties of interface prototype object assert_equals: class string of HTMLCollection.prototype expected "[object HTMLCollectionPrototype]" but got "[object HTMLCollection]"
-PASS HTMLCollection interface: existence and properties of interface prototype object's "constructor" property 
-PASS HTMLCollection interface: attribute length 
-PASS HTMLCollection interface: operation item(unsigned long) 
-PASS HTMLCollection interface: operation namedItem(DOMString) 
-PASS HTMLCollection must be primary interface of document.body.children 
-PASS Stringification of document.body.children 
-PASS HTMLCollection interface: document.body.children must inherit property "length" with the proper type (0) 
-PASS HTMLCollection interface: document.body.children must inherit property "item" with the proper type (1) 
-PASS HTMLCollection interface: calling item(unsigned long) on document.body.children with too few arguments must throw TypeError 
-PASS HTMLCollection interface: document.body.children must inherit property "namedItem" with the proper type (2) 
-PASS HTMLCollection interface: calling namedItem(DOMString) on document.body.children with too few arguments must throw TypeError 
-PASS MutationObserver interface: existence and properties of interface object 
-PASS MutationObserver interface object length 
-PASS MutationObserver interface object name 
-FAIL MutationObserver interface: existence and properties of interface prototype object assert_equals: class string of MutationObserver.prototype expected "[object MutationObserverPrototype]" but got "[object MutationObserver]"
-PASS MutationObserver interface: existence and properties of interface prototype object's "constructor" property 
-PASS MutationObserver interface: operation observe(Node,MutationObserverInit) 
-PASS MutationObserver interface: operation disconnect() 
-PASS MutationObserver interface: operation takeRecords() 
-PASS MutationRecord interface: existence and properties of interface object 
-PASS MutationRecord interface object length 
-PASS MutationRecord interface object name 
-FAIL MutationRecord interface: existence and properties of interface prototype object assert_equals: class string of MutationRecord.prototype expected "[object MutationRecordPrototype]" but got "[object MutationRecord]"
-PASS MutationRecord interface: existence and properties of interface prototype object's "constructor" property 
-PASS MutationRecord interface: attribute type 
-PASS MutationRecord interface: attribute target 
-PASS MutationRecord interface: attribute addedNodes 
-PASS MutationRecord interface: attribute removedNodes 
-PASS MutationRecord interface: attribute previousSibling 
-PASS MutationRecord interface: attribute nextSibling 
-PASS MutationRecord interface: attribute attributeName 
-PASS MutationRecord interface: attribute attributeNamespace 
-PASS MutationRecord interface: attribute oldValue 
-PASS Node interface: existence and properties of interface object 
-PASS Node interface object length 
-PASS Node interface object name 
-FAIL Node interface: existence and properties of interface prototype object assert_equals: class string of Node.prototype expected "[object NodePrototype]" but got "[object Node]"
-PASS Node interface: existence and properties of interface prototype object's "constructor" property 
-PASS Node interface: constant ELEMENT_NODE on interface object 
-PASS Node interface: constant ELEMENT_NODE on interface prototype object 
-PASS Node interface: constant ATTRIBUTE_NODE on interface object 
-PASS Node interface: constant ATTRIBUTE_NODE on interface prototype object 
-PASS Node interface: constant TEXT_NODE on interface object 
-PASS Node interface: constant TEXT_NODE on interface prototype object 
-PASS Node interface: constant CDATA_SECTION_NODE on interface object 
-PASS Node interface: constant CDATA_SECTION_NODE on interface prototype object 
-PASS Node interface: constant ENTITY_REFERENCE_NODE on interface object 
-PASS Node interface: constant ENTITY_REFERENCE_NODE on interface prototype object 
-PASS Node interface: constant ENTITY_NODE on interface object 
-PASS Node interface: constant ENTITY_NODE on interface prototype object 
-PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface object 
-PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface prototype object 
-PASS Node interface: constant COMMENT_NODE on interface object 
-PASS Node interface: constant COMMENT_NODE on interface prototype object 
-PASS Node interface: constant DOCUMENT_NODE on interface object 
-PASS Node interface: constant DOCUMENT_NODE on interface prototype object 
-PASS Node interface: constant DOCUMENT_TYPE_NODE on interface object 
-PASS Node interface: constant DOCUMENT_TYPE_NODE on interface prototype object 
-PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface object 
-PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface prototype object 
-PASS Node interface: constant NOTATION_NODE on interface object 
-PASS Node interface: constant NOTATION_NODE on interface prototype object 
-PASS Node interface: attribute nodeType 
-PASS Node interface: attribute nodeName 
-PASS Node interface: attribute baseURI 
-PASS Node interface: attribute isConnected 
-PASS Node interface: attribute ownerDocument 
-PASS Node interface: operation getRootNode(GetRootNodeOptions) 
-PASS Node interface: attribute parentNode 
-PASS Node interface: attribute parentElement 
-PASS Node interface: operation hasChildNodes() 
-PASS Node interface: attribute childNodes 
-PASS Node interface: attribute firstChild 
-PASS Node interface: attribute lastChild 
-PASS Node interface: attribute previousSibling 
-PASS Node interface: attribute nextSibling 
-PASS Node interface: attribute nodeValue 
-PASS Node interface: attribute textContent 
-PASS Node interface: operation normalize() 
-PASS Node interface: operation cloneNode(boolean) 
-PASS Node interface: operation isEqualNode(Node) 
-PASS Node interface: operation isSameNode(Node) 
-PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface prototype object 
-PASS Node interface: operation compareDocumentPosition(Node) 
-PASS Node interface: operation contains(Node) 
-PASS Node interface: operation lookupPrefix(DOMString) 
-PASS Node interface: operation lookupNamespaceURI(DOMString) 
-PASS Node interface: operation isDefaultNamespace(DOMString) 
-PASS Node interface: operation insertBefore(Node,Node) 
-PASS Node interface: operation appendChild(Node) 
-PASS Node interface: operation replaceChild(Node,Node) 
-PASS Node interface: operation removeChild(Node) 
-PASS Document interface: existence and properties of interface object 
-PASS Document interface object length 
-PASS Document interface object name 
-FAIL Document interface: existence and properties of interface prototype object assert_equals: class string of Document.prototype expected "[object DocumentPrototype]" but got "[object Document]"
-PASS Document interface: existence and properties of interface prototype object's "constructor" property 
-PASS Document interface: attribute implementation 
-PASS Document interface: attribute URL 
-PASS Document interface: attribute documentURI 
-PASS Document interface: attribute origin 
-PASS Document interface: attribute compatMode 
-PASS Document interface: attribute characterSet 
-PASS Document interface: attribute charset 
-PASS Document interface: attribute inputEncoding 
-PASS Document interface: attribute contentType 
-PASS Document interface: attribute doctype 
-PASS Document interface: attribute documentElement 
-PASS Document interface: operation getElementsByTagName(DOMString) 
-PASS Document interface: operation getElementsByTagNameNS(DOMString,DOMString) 
-PASS Document interface: operation getElementsByClassName(DOMString) 
-PASS Document interface: operation createElement(DOMString,ElementCreationOptions) 
-PASS Document interface: operation createElementNS(DOMString,DOMString,ElementCreationOptions) 
-PASS Document interface: operation createDocumentFragment() 
-PASS Document interface: operation createTextNode(DOMString) 
-PASS Document interface: operation createCDATASection(DOMString) 
-PASS Document interface: operation createComment(DOMString) 
-PASS Document interface: operation createProcessingInstruction(DOMString,DOMString) 
-PASS Document interface: operation importNode(Node,boolean) 
-PASS Document interface: operation adoptNode(Node) 
-PASS Document interface: operation createAttribute(DOMString) 
-PASS Document interface: operation createAttributeNS(DOMString,DOMString) 
-PASS Document interface: operation createEvent(DOMString) 
-PASS Document interface: operation createRange() 
-PASS Document interface: operation createNodeIterator(Node,unsigned long,NodeFilter) 
-PASS Document interface: operation createTreeWalker(Node,unsigned long,NodeFilter) 
-PASS Document interface: operation getElementById(DOMString) 
-PASS Document interface: attribute children 
-PASS Document interface: attribute firstElementChild 
-PASS Document interface: attribute lastElementChild 
-PASS Document interface: attribute childElementCount 
-PASS Document interface: operation prepend([object Object],[object Object]) 
-PASS Document interface: operation append([object Object],[object Object]) 
-PASS Document interface: operation querySelector(DOMString) 
-PASS Document interface: operation querySelectorAll(DOMString) 
-FAIL Document must be primary interface of new Document() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Stringification of new Document() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "implementation" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "URL" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "documentURI" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "origin" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "compatMode" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "characterSet" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "charset" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "inputEncoding" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "contentType" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "doctype" with the proper type (9) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "documentElement" with the proper type (10) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementsByTagName" with the proper type (11) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementsByTagName(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementsByTagNameNS" with the proper type (12) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementsByClassName" with the proper type (13) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementsByClassName(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createElement" with the proper type (14) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createElement(DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createElementNS" with the proper type (15) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createDocumentFragment" with the proper type (16) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createTextNode" with the proper type (17) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createTextNode(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createCDATASection" with the proper type (18) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createCDATASection(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createComment" with the proper type (19) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createComment(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createProcessingInstruction" with the proper type (20) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createProcessingInstruction(DOMString,DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "importNode" with the proper type (21) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling importNode(Node,boolean) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "adoptNode" with the proper type (22) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling adoptNode(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createAttribute" with the proper type (23) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createAttribute(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createAttributeNS" with the proper type (24) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createAttributeNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createEvent" with the proper type (25) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createEvent(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createRange" with the proper type (26) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createNodeIterator" with the proper type (27) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createTreeWalker" with the proper type (28) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementById" with the proper type (29) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementById(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "children" with the proper type (30) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "firstElementChild" with the proper type (31) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "lastElementChild" with the proper type (32) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "childElementCount" with the proper type (33) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "prepend" with the proper type (34) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling prepend([object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "append" with the proper type (35) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling append([object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "querySelector" with the proper type (36) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling querySelector(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "querySelectorAll" with the proper type (37) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling querySelectorAll(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ELEMENT_NODE" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ATTRIBUTE_NODE" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "TEXT_NODE" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "CDATA_SECTION_NODE" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ENTITY_NODE" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "COMMENT_NODE" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_NODE" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "NOTATION_NODE" with the proper type (11) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nodeType" with the proper type (12) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nodeName" with the proper type (13) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "baseURI" with the proper type (14) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isConnected" with the proper type (15) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ownerDocument" with the proper type (16) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "getRootNode" with the proper type (17) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling getRootNode(GetRootNodeOptions) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "parentNode" with the proper type (18) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "parentElement" with the proper type (19) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "hasChildNodes" with the proper type (20) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "childNodes" with the proper type (21) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "firstChild" with the proper type (22) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "lastChild" with the proper type (23) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "previousSibling" with the proper type (24) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nextSibling" with the proper type (25) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nodeValue" with the proper type (26) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "textContent" with the proper type (27) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "normalize" with the proper type (28) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "cloneNode" with the proper type (29) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling cloneNode(boolean) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isEqualNode" with the proper type (30) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling isEqualNode(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isSameNode" with the proper type (31) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling isSameNode(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "compareDocumentPosition" with the proper type (38) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling compareDocumentPosition(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "contains" with the proper type (39) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling contains(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "lookupPrefix" with the proper type (40) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling lookupPrefix(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "lookupNamespaceURI" with the proper type (41) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling lookupNamespaceURI(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isDefaultNamespace" with the proper type (42) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling isDefaultNamespace(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "insertBefore" with the proper type (43) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling insertBefore(Node,Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "appendChild" with the proper type (44) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling appendChild(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "replaceChild" with the proper type (45) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling replaceChild(Node,Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "removeChild" with the proper type (46) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling removeChild(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new Document() must inherit property "addEventListener" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new Document() must inherit property "removeEventListener" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new Document() must inherit property "dispatchEvent" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: calling dispatchEvent(Event) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-PASS XMLDocument interface: existence and properties of interface object 
-PASS XMLDocument interface object length 
-PASS XMLDocument interface object name 
-FAIL XMLDocument interface: existence and properties of interface prototype object assert_equals: class string of XMLDocument.prototype expected "[object XMLDocumentPrototype]" but got "[object XMLDocument]"
-PASS XMLDocument interface: existence and properties of interface prototype object's "constructor" property 
-PASS XMLDocument must be primary interface of xmlDoc 
-PASS Stringification of xmlDoc 
-PASS Document interface: xmlDoc must inherit property "implementation" with the proper type (0) 
-PASS Document interface: xmlDoc must inherit property "URL" with the proper type (1) 
-FAIL Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) assert_equals: expected "string" but got "object"
-PASS Document interface: xmlDoc must inherit property "origin" with the proper type (3) 
-PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type (4) 
-PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type (5) 
-PASS Document interface: xmlDoc must inherit property "charset" with the proper type (6) 
-PASS Document interface: xmlDoc must inherit property "inputEncoding" with the proper type (7) 
-PASS Document interface: xmlDoc must inherit property "contentType" with the proper type (8) 
-PASS Document interface: xmlDoc must inherit property "doctype" with the proper type (9) 
-PASS Document interface: xmlDoc must inherit property "documentElement" with the proper type (10) 
-PASS Document interface: xmlDoc must inherit property "getElementsByTagName" with the proper type (11) 
-PASS Document interface: calling getElementsByTagName(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "getElementsByTagNameNS" with the proper type (12) 
-PASS Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "getElementsByClassName" with the proper type (13) 
-PASS Document interface: calling getElementsByClassName(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createElement" with the proper type (14) 
-PASS Document interface: calling createElement(DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createElementNS" with the proper type (15) 
-PASS Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createDocumentFragment" with the proper type (16) 
-PASS Document interface: xmlDoc must inherit property "createTextNode" with the proper type (17) 
-PASS Document interface: calling createTextNode(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createCDATASection" with the proper type (18) 
-PASS Document interface: calling createCDATASection(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createComment" with the proper type (19) 
-PASS Document interface: calling createComment(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createProcessingInstruction" with the proper type (20) 
-PASS Document interface: calling createProcessingInstruction(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "importNode" with the proper type (21) 
-PASS Document interface: calling importNode(Node,boolean) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "adoptNode" with the proper type (22) 
-PASS Document interface: calling adoptNode(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createAttribute" with the proper type (23) 
-PASS Document interface: calling createAttribute(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createAttributeNS" with the proper type (24) 
-PASS Document interface: calling createAttributeNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createEvent" with the proper type (25) 
-PASS Document interface: calling createEvent(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createRange" with the proper type (26) 
-PASS Document interface: xmlDoc must inherit property "createNodeIterator" with the proper type (27) 
-PASS Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createTreeWalker" with the proper type (28) 
-PASS Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "getElementById" with the proper type (29) 
-PASS Document interface: calling getElementById(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "children" with the proper type (30) 
-PASS Document interface: xmlDoc must inherit property "firstElementChild" with the proper type (31) 
-PASS Document interface: xmlDoc must inherit property "lastElementChild" with the proper type (32) 
-PASS Document interface: xmlDoc must inherit property "childElementCount" with the proper type (33) 
-PASS Document interface: xmlDoc must inherit property "prepend" with the proper type (34) 
-PASS Document interface: calling prepend([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "append" with the proper type (35) 
-PASS Document interface: calling append([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "querySelector" with the proper type (36) 
-PASS Document interface: calling querySelector(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "querySelectorAll" with the proper type (37) 
-PASS Document interface: calling querySelectorAll(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: xmlDoc must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: xmlDoc must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: xmlDoc must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: xmlDoc must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: xmlDoc must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: xmlDoc must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: xmlDoc must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: xmlDoc must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: xmlDoc must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: xmlDoc must inherit property "nodeName" with the proper type (13) 
-FAIL Node interface: xmlDoc must inherit property "baseURI" with the proper type (14) assert_equals: expected "string" but got "object"
-PASS Node interface: xmlDoc must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: xmlDoc must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: xmlDoc must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: xmlDoc must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: xmlDoc must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: xmlDoc must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: xmlDoc must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: xmlDoc must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: xmlDoc must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: xmlDoc must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: xmlDoc must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: xmlDoc must inherit property "textContent" with the proper type (27) 
-PASS Node interface: xmlDoc must inherit property "normalize" with the proper type (28) 
-PASS Node interface: xmlDoc must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: xmlDoc must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc with too few arguments must throw TypeError 
-PASS DOMImplementation interface: existence and properties of interface object 
-PASS DOMImplementation interface object length 
-PASS DOMImplementation interface object name 
-FAIL DOMImplementation interface: existence and properties of interface prototype object assert_equals: class string of DOMImplementation.prototype expected "[object DOMImplementationPrototype]" but got "[object DOMImplementation]"
-PASS DOMImplementation interface: existence and properties of interface prototype object's "constructor" property 
-PASS DOMImplementation interface: operation createDocumentType(DOMString,DOMString,DOMString) 
-PASS DOMImplementation interface: operation createDocument(DOMString,DOMString,DocumentType) 
-PASS DOMImplementation interface: operation createHTMLDocument(DOMString) 
-PASS DOMImplementation interface: operation hasFeature() 
-PASS DOMImplementation must be primary interface of document.implementation 
-PASS Stringification of document.implementation 
-PASS DOMImplementation interface: document.implementation must inherit property "createDocumentType" with the proper type (0) 
-PASS DOMImplementation interface: calling createDocumentType(DOMString,DOMString,DOMString) on document.implementation with too few arguments must throw TypeError 
-PASS DOMImplementation interface: document.implementation must inherit property "createDocument" with the proper type (1) 
-PASS DOMImplementation interface: calling createDocument(DOMString,DOMString,DocumentType) on document.implementation with too few arguments must throw TypeError 
-PASS DOMImplementation interface: document.implementation must inherit property "createHTMLDocument" with the proper type (2) 
-PASS DOMImplementation interface: calling createHTMLDocument(DOMString) on document.implementation with too few arguments must throw TypeError 
-PASS DOMImplementation interface: document.implementation must inherit property "hasFeature" with the proper type (3) 
-PASS DocumentType interface: existence and properties of interface object 
-PASS DocumentType interface object length 
-PASS DocumentType interface object name 
-FAIL DocumentType interface: existence and properties of interface prototype object assert_equals: class string of DocumentType.prototype expected "[object DocumentTypePrototype]" but got "[object DocumentType]"
-PASS DocumentType interface: existence and properties of interface prototype object's "constructor" property 
-PASS DocumentType interface: attribute name 
-PASS DocumentType interface: attribute publicId 
-PASS DocumentType interface: attribute systemId 
-PASS DocumentType interface: operation before([object Object],[object Object]) 
-PASS DocumentType interface: operation after([object Object],[object Object]) 
-PASS DocumentType interface: operation replaceWith([object Object],[object Object]) 
-PASS DocumentType interface: operation remove() 
-PASS DocumentType must be primary interface of document.doctype 
-PASS Stringification of document.doctype 
-PASS DocumentType interface: document.doctype must inherit property "name" with the proper type (0) 
-PASS DocumentType interface: document.doctype must inherit property "publicId" with the proper type (1) 
-PASS DocumentType interface: document.doctype must inherit property "systemId" with the proper type (2) 
-PASS DocumentType interface: document.doctype must inherit property "before" with the proper type (3) 
-PASS DocumentType interface: calling before([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentType interface: document.doctype must inherit property "after" with the proper type (4) 
-PASS DocumentType interface: calling after([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentType interface: document.doctype must inherit property "replaceWith" with the proper type (5) 
-PASS DocumentType interface: calling replaceWith([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentType interface: document.doctype must inherit property "remove" with the proper type (6) 
-PASS Node interface: document.doctype must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.doctype must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.doctype must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.doctype must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.doctype must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.doctype must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.doctype must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.doctype must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.doctype must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.doctype must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.doctype must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.doctype must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.doctype must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.doctype must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.doctype must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.doctype must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.doctype must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.doctype must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.doctype must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.doctype must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.doctype must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.doctype must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.doctype must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.doctype must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.doctype must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.doctype must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.doctype must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.doctype with too few arguments must throw TypeError 
-PASS EventTarget interface: document.doctype must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS EventTarget interface: document.doctype must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS EventTarget interface: document.doctype must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentFragment interface: existence and properties of interface object 
-PASS DocumentFragment interface object length 
-PASS DocumentFragment interface object name 
-FAIL DocumentFragment interface: existence and properties of interface prototype object assert_equals: class string of DocumentFragment.prototype expected "[object DocumentFragmentPrototype]" but got "[object DocumentFragment]"
-PASS DocumentFragment interface: existence and properties of interface prototype object's "constructor" property 
-PASS DocumentFragment interface: operation getElementById(DOMString) 
-PASS DocumentFragment interface: attribute children 
-PASS DocumentFragment interface: attribute firstElementChild 
-PASS DocumentFragment interface: attribute lastElementChild 
-PASS DocumentFragment interface: attribute childElementCount 
-PASS DocumentFragment interface: operation prepend([object Object],[object Object]) 
-PASS DocumentFragment interface: operation append([object Object],[object Object]) 
-PASS DocumentFragment interface: operation querySelector(DOMString) 
-PASS DocumentFragment interface: operation querySelectorAll(DOMString) 
-PASS DocumentFragment must be primary interface of document.createDocumentFragment() 
-PASS Stringification of document.createDocumentFragment() 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "getElementById" with the proper type (0) 
-PASS DocumentFragment interface: calling getElementById(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "children" with the proper type (1) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "firstElementChild" with the proper type (2) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "lastElementChild" with the proper type (3) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "childElementCount" with the proper type (4) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "prepend" with the proper type (5) 
-PASS DocumentFragment interface: calling prepend([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "append" with the proper type (6) 
-PASS DocumentFragment interface: calling append([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelector" with the proper type (7) 
-PASS DocumentFragment interface: calling querySelector(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelectorAll" with the proper type (8) 
-PASS DocumentFragment interface: calling querySelectorAll(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.createDocumentFragment() must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.createDocumentFragment() must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.createDocumentFragment() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.createDocumentFragment() must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.createDocumentFragment() must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.createDocumentFragment() must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.createDocumentFragment() must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.createDocumentFragment() must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.createDocumentFragment() must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.createDocumentFragment() must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.createDocumentFragment() must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.createDocumentFragment() must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.createDocumentFragment() must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.createDocumentFragment() must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.createDocumentFragment() must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.createDocumentFragment() must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.createDocumentFragment() must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.createDocumentFragment() must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createDocumentFragment() must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createDocumentFragment() must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createDocumentFragment() must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS ShadowRoot interface: existence and properties of interface object 
-PASS ShadowRoot interface object length 
-PASS ShadowRoot interface object name 
-FAIL ShadowRoot interface: existence and properties of interface prototype object assert_equals: class string of ShadowRoot.prototype expected "[object ShadowRootPrototype]" but got "[object ShadowRoot]"
-PASS ShadowRoot interface: existence and properties of interface prototype object's "constructor" property 
-PASS ShadowRoot interface: attribute mode 
-PASS ShadowRoot interface: attribute host 
-PASS Element interface: existence and properties of interface object 
-PASS Element interface object length 
-PASS Element interface object name 
-FAIL Element interface: existence and properties of interface prototype object assert_equals: class string of Element.prototype expected "[object ElementPrototype]" but got "[object Element]"
-PASS Element interface: existence and properties of interface prototype object's "constructor" property 
-PASS Element interface: attribute namespaceURI 
-PASS Element interface: attribute prefix 
-PASS Element interface: attribute localName 
-PASS Element interface: attribute tagName 
-PASS Element interface: attribute id 
-PASS Element interface: attribute className 
-PASS Element interface: attribute classList 
-PASS Element interface: attribute slot 
-PASS Element interface: operation hasAttributes() 
-PASS Element interface: attribute attributes 
-FAIL Element interface: operation getAttributeNames() assert_own_property: interface prototype object missing non-static operation expected property "getAttributeNames" missing
-PASS Element interface: operation getAttribute(DOMString) 
-PASS Element interface: operation getAttributeNS(DOMString,DOMString) 
-PASS Element interface: operation setAttribute(DOMString,DOMString) 
-PASS Element interface: operation setAttributeNS(DOMString,DOMString,DOMString) 
-PASS Element interface: operation removeAttribute(DOMString) 
-PASS Element interface: operation removeAttributeNS(DOMString,DOMString) 
-PASS Element interface: operation hasAttribute(DOMString) 
-PASS Element interface: operation hasAttributeNS(DOMString,DOMString) 
-PASS Element interface: operation getAttributeNode(DOMString) 
-PASS Element interface: operation getAttributeNodeNS(DOMString,DOMString) 
-PASS Element interface: operation setAttributeNode(Attr) 
-PASS Element interface: operation setAttributeNodeNS(Attr) 
-PASS Element interface: operation removeAttributeNode(Attr) 
-PASS Element interface: operation attachShadow(ShadowRootInit) 
-PASS Element interface: attribute shadowRoot 
-PASS Element interface: operation closest(DOMString) 
-PASS Element interface: operation matches(DOMString) 
-PASS Element interface: operation webkitMatchesSelector(DOMString) 
-PASS Element interface: operation getElementsByTagName(DOMString) 
-PASS Element interface: operation getElementsByTagNameNS(DOMString,DOMString) 
-PASS Element interface: operation getElementsByClassName(DOMString) 
-PASS Element interface: operation insertAdjacentElement(DOMString,Element) 
-PASS Element interface: operation insertAdjacentText(DOMString,DOMString) 
-PASS Element interface: attribute children 
-PASS Element interface: attribute firstElementChild 
-PASS Element interface: attribute lastElementChild 
-PASS Element interface: attribute childElementCount 
-PASS Element interface: operation prepend([object Object],[object Object]) 
-PASS Element interface: operation append([object Object],[object Object]) 
-PASS Element interface: operation querySelector(DOMString) 
-PASS Element interface: operation querySelectorAll(DOMString) 
-PASS Element interface: attribute previousElementSibling 
-PASS Element interface: attribute nextElementSibling 
-PASS Element interface: operation before([object Object],[object Object]) 
-PASS Element interface: operation after([object Object],[object Object]) 
-PASS Element interface: operation replaceWith([object Object],[object Object]) 
-PASS Element interface: operation remove() 
-PASS Element interface: attribute assignedSlot 
-PASS Element must be primary interface of element 
-PASS Stringification of element 
-PASS Element interface: element must inherit property "namespaceURI" with the proper type (0) 
-PASS Element interface: element must inherit property "prefix" with the proper type (1) 
-PASS Element interface: element must inherit property "localName" with the proper type (2) 
-PASS Element interface: element must inherit property "tagName" with the proper type (3) 
-PASS Element interface: element must inherit property "id" with the proper type (4) 
-PASS Element interface: element must inherit property "className" with the proper type (5) 
-PASS Element interface: element must inherit property "classList" with the proper type (6) 
-PASS Element interface: element must inherit property "slot" with the proper type (7) 
-PASS Element interface: element must inherit property "hasAttributes" with the proper type (8) 
-PASS Element interface: element must inherit property "attributes" with the proper type (9) 
-FAIL Element interface: element must inherit property "getAttributeNames" with the proper type (10) assert_inherits: property "getAttributeNames" not found in prototype chain
-PASS Element interface: element must inherit property "getAttribute" with the proper type (11) 
-PASS Element interface: calling getAttribute(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getAttributeNS" with the proper type (12) 
-PASS Element interface: calling getAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttribute" with the proper type (13) 
-PASS Element interface: calling setAttribute(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttributeNS" with the proper type (14) 
-PASS Element interface: calling setAttributeNS(DOMString,DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "removeAttribute" with the proper type (15) 
-PASS Element interface: calling removeAttribute(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "removeAttributeNS" with the proper type (16) 
-PASS Element interface: calling removeAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "hasAttribute" with the proper type (17) 
-PASS Element interface: calling hasAttribute(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "hasAttributeNS" with the proper type (18) 
-PASS Element interface: calling hasAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getAttributeNode" with the proper type (19) 
-PASS Element interface: calling getAttributeNode(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getAttributeNodeNS" with the proper type (20) 
-PASS Element interface: calling getAttributeNodeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttributeNode" with the proper type (21) 
-PASS Element interface: calling setAttributeNode(Attr) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttributeNodeNS" with the proper type (22) 
-PASS Element interface: calling setAttributeNodeNS(Attr) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "removeAttributeNode" with the proper type (23) 
-PASS Element interface: calling removeAttributeNode(Attr) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "attachShadow" with the proper type (24) 
-PASS Element interface: calling attachShadow(ShadowRootInit) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "shadowRoot" with the proper type (25) 
-PASS Element interface: element must inherit property "closest" with the proper type (26) 
-PASS Element interface: calling closest(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "matches" with the proper type (27) 
-PASS Element interface: calling matches(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "webkitMatchesSelector" with the proper type (28) 
-PASS Element interface: calling webkitMatchesSelector(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getElementsByTagName" with the proper type (29) 
-PASS Element interface: calling getElementsByTagName(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getElementsByTagNameNS" with the proper type (30) 
-PASS Element interface: calling getElementsByTagNameNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getElementsByClassName" with the proper type (31) 
-PASS Element interface: calling getElementsByClassName(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "insertAdjacentElement" with the proper type (32) 
-PASS Element interface: calling insertAdjacentElement(DOMString,Element) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "insertAdjacentText" with the proper type (33) 
-PASS Element interface: calling insertAdjacentText(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "children" with the proper type (34) 
-PASS Element interface: element must inherit property "firstElementChild" with the proper type (35) 
-PASS Element interface: element must inherit property "lastElementChild" with the proper type (36) 
-PASS Element interface: element must inherit property "childElementCount" with the proper type (37) 
-PASS Element interface: element must inherit property "prepend" with the proper type (38) 
-PASS Element interface: calling prepend([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "append" with the proper type (39) 
-PASS Element interface: calling append([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "querySelector" with the proper type (40) 
-PASS Element interface: calling querySelector(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "querySelectorAll" with the proper type (41) 
-PASS Element interface: calling querySelectorAll(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "previousElementSibling" with the proper type (42) 
-PASS Element interface: element must inherit property "nextElementSibling" with the proper type (43) 
-PASS Element interface: element must inherit property "before" with the proper type (44) 
-PASS Element interface: calling before([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "after" with the proper type (45) 
-PASS Element interface: calling after([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "replaceWith" with the proper type (46) 
-PASS Element interface: calling replaceWith([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "remove" with the proper type (47) 
-PASS Element interface: element must inherit property "assignedSlot" with the proper type (48) 
-PASS Node interface: element must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: element must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: element must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: element must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: element must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: element must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: element must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: element must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: element must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: element must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: element must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: element must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: element must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: element must inherit property "nodeName" with the proper type (13) 
-FAIL Node interface: element must inherit property "baseURI" with the proper type (14) assert_equals: expected "string" but got "object"
-PASS Node interface: element must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: element must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: element must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: element must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: element must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: element must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: element must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: element must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: element must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: element must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: element must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: element must inherit property "textContent" with the proper type (27) 
-PASS Node interface: element must inherit property "normalize" with the proper type (28) 
-PASS Node interface: element must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: element must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on element with too few arguments must throw TypeError 
-PASS EventTarget interface: element must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS EventTarget interface: element must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS EventTarget interface: element must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on element with too few arguments must throw TypeError 
-PASS NamedNodeMap interface: existence and properties of interface object 
-PASS NamedNodeMap interface object length 
-PASS NamedNodeMap interface object name 
-FAIL NamedNodeMap interface: existence and properties of interface prototype object assert_equals: class string of NamedNodeMap.prototype expected "[object NamedNodeMapPrototype]" but got "[object NamedNodeMap]"
-PASS NamedNodeMap interface: existence and properties of interface prototype object's "constructor" property 
-PASS NamedNodeMap interface: attribute length 
-PASS NamedNodeMap interface: operation item(unsigned long) 
-PASS NamedNodeMap interface: operation getNamedItem(DOMString) 
-PASS NamedNodeMap interface: operation getNamedItemNS(DOMString,DOMString) 
-PASS NamedNodeMap interface: operation setNamedItem(Attr) 
-PASS NamedNodeMap interface: operation setNamedItemNS(Attr) 
-PASS NamedNodeMap interface: operation removeNamedItem(DOMString) 
-PASS NamedNodeMap interface: operation removeNamedItemNS(DOMString,DOMString) 
-PASS Attr interface: existence and properties of interface object 
-PASS Attr interface object length 
-PASS Attr interface object name 
-FAIL Attr interface: existence and properties of interface prototype object assert_equals: class string of Attr.prototype expected "[object AttrPrototype]" but got "[object Attr]"
-PASS Attr interface: existence and properties of interface prototype object's "constructor" property 
-PASS Attr interface: attribute namespaceURI 
-PASS Attr interface: attribute prefix 
-PASS Attr interface: attribute localName 
-PASS Attr interface: attribute name 
-PASS Attr interface: attribute value 
-PASS Attr interface: attribute ownerElement 
-PASS Attr interface: attribute specified 
-PASS Attr must be primary interface of document.querySelector("[id]").attributes[0] 
-PASS Stringification of document.querySelector("[id]").attributes[0] 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "namespaceURI" with the proper type (0) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "prefix" with the proper type (1) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "localName" with the proper type (2) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "name" with the proper type (3) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "value" with the proper type (4) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "ownerElement" with the proper type (5) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "specified" with the proper type (6) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS CharacterData interface: existence and properties of interface object 
-PASS CharacterData interface object length 
-PASS CharacterData interface object name 
-FAIL CharacterData interface: existence and properties of interface prototype object assert_equals: class string of CharacterData.prototype expected "[object CharacterDataPrototype]" but got "[object CharacterData]"
-PASS CharacterData interface: existence and properties of interface prototype object's "constructor" property 
-PASS CharacterData interface: attribute data 
-PASS CharacterData interface: attribute length 
-PASS CharacterData interface: operation substringData(unsigned long,unsigned long) 
-PASS CharacterData interface: operation appendData(DOMString) 
-PASS CharacterData interface: operation insertData(unsigned long,DOMString) 
-PASS CharacterData interface: operation deleteData(unsigned long,unsigned long) 
-PASS CharacterData interface: operation replaceData(unsigned long,unsigned long,DOMString) 
-PASS CharacterData interface: attribute previousElementSibling 
-PASS CharacterData interface: attribute nextElementSibling 
-PASS CharacterData interface: operation before([object Object],[object Object]) 
-PASS CharacterData interface: operation after([object Object],[object Object]) 
-PASS CharacterData interface: operation replaceWith([object Object],[object Object]) 
-PASS CharacterData interface: operation remove() 
-PASS Text interface: existence and properties of interface object 
-PASS Text interface object length 
-PASS Text interface object name 
-FAIL Text interface: existence and properties of interface prototype object assert_equals: class string of Text.prototype expected "[object TextPrototype]" but got "[object Text]"
-PASS Text interface: existence and properties of interface prototype object's "constructor" property 
-PASS Text interface: operation splitText(unsigned long) 
-PASS Text interface: attribute wholeText 
-PASS Text interface: attribute assignedSlot 
-PASS Text must be primary interface of document.createTextNode("abc") 
-PASS Stringification of document.createTextNode("abc") 
-PASS Text interface: document.createTextNode("abc") must inherit property "splitText" with the proper type (0) 
-PASS Text interface: calling splitText(unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Text interface: document.createTextNode("abc") must inherit property "wholeText" with the proper type (1) 
-PASS Text interface: document.createTextNode("abc") must inherit property "assignedSlot" with the proper type (2) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "data" with the proper type (0) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "length" with the proper type (1) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "substringData" with the proper type (2) 
-PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "appendData" with the proper type (3) 
-PASS CharacterData interface: calling appendData(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "insertData" with the proper type (4) 
-PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "deleteData" with the proper type (5) 
-PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceData" with the proper type (6) 
-PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "previousElementSibling" with the proper type (7) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "nextElementSibling" with the proper type (8) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "before" with the proper type (9) 
-PASS CharacterData interface: calling before([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "after" with the proper type (10) 
-PASS CharacterData interface: calling after([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceWith" with the proper type (11) 
-PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "remove" with the proper type (12) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.createTextNode("abc") must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.createTextNode("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.createTextNode("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.createTextNode("abc") must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.createTextNode("abc") must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.createTextNode("abc") must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.createTextNode("abc") must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.createTextNode("abc") must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.createTextNode("abc") must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.createTextNode("abc") must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.createTextNode("abc") must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.createTextNode("abc") must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.createTextNode("abc") must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.createTextNode("abc") must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.createTextNode("abc") must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.createTextNode("abc") must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.createTextNode("abc") must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.createTextNode("abc") must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createTextNode("abc") must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createTextNode("abc") must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createTextNode("abc") must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CDATASection interface: existence and properties of interface object 
-PASS CDATASection interface object length 
-PASS CDATASection interface object name 
-FAIL CDATASection interface: existence and properties of interface prototype object assert_equals: class string of CDATASection.prototype expected "[object CDATASectionPrototype]" but got "[object CDATASection]"
-PASS CDATASection interface: existence and properties of interface prototype object's "constructor" property 
-PASS ProcessingInstruction interface: existence and properties of interface object 
-PASS ProcessingInstruction interface object length 
-PASS ProcessingInstruction interface object name 
-FAIL ProcessingInstruction interface: existence and properties of interface prototype object assert_equals: class string of ProcessingInstruction.prototype expected "[object ProcessingInstructionPrototype]" but got "[object ProcessingInstruction]"
-PASS ProcessingInstruction interface: existence and properties of interface prototype object's "constructor" property 
-PASS ProcessingInstruction interface: attribute target 
-PASS ProcessingInstruction must be primary interface of xmlDoc.createProcessingInstruction("abc", "def") 
-PASS Stringification of xmlDoc.createProcessingInstruction("abc", "def") 
-PASS ProcessingInstruction interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "target" with the proper type (0) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "data" with the proper type (0) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "length" with the proper type (1) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "substringData" with the proper type (2) 
-PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendData" with the proper type (3) 
-PASS CharacterData interface: calling appendData(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertData" with the proper type (4) 
-PASS CharacterData interface: calling insertData(unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "deleteData" with the proper type (5) 
-PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceData" with the proper type (6) 
-PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousElementSibling" with the proper type (7) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextElementSibling" with the proper type (8) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "before" with the proper type (9) 
-PASS CharacterData interface: calling before([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "after" with the proper type (10) 
-PASS CharacterData interface: calling after([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceWith" with the proper type (11) 
-PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "remove" with the proper type (12) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeName" with the proper type (13) 
-FAIL Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "baseURI" with the proper type (14) assert_equals: expected "string" but got "object"
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "textContent" with the proper type (27) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "normalize" with the proper type (28) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Comment interface: existence and properties of interface object 
-PASS Comment interface object length 
-PASS Comment interface object name 
-FAIL Comment interface: existence and properties of interface prototype object assert_equals: class string of Comment.prototype expected "[object CommentPrototype]" but got "[object Comment]"
-PASS Comment interface: existence and properties of interface prototype object's "constructor" property 
-PASS Comment must be primary interface of document.createComment("abc") 
-PASS Stringification of document.createComment("abc") 
-PASS CharacterData interface: document.createComment("abc") must inherit property "data" with the proper type (0) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "length" with the proper type (1) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "substringData" with the proper type (2) 
-PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "appendData" with the proper type (3) 
-PASS CharacterData interface: calling appendData(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "insertData" with the proper type (4) 
-PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "deleteData" with the proper type (5) 
-PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "replaceData" with the proper type (6) 
-PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "previousElementSibling" with the proper type (7) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "nextElementSibling" with the proper type (8) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "before" with the proper type (9) 
-PASS CharacterData interface: calling before([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "after" with the proper type (10) 
-PASS CharacterData interface: calling after([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "replaceWith" with the proper type (11) 
-PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "remove" with the proper type (12) 
-PASS Node interface: document.createComment("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.createComment("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.createComment("abc") must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.createComment("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.createComment("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.createComment("abc") must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.createComment("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.createComment("abc") must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.createComment("abc") must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.createComment("abc") must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.createComment("abc") must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.createComment("abc") must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.createComment("abc") must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.createComment("abc") must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.createComment("abc") must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.createComment("abc") must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.createComment("abc") must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.createComment("abc") must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.createComment("abc") must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.createComment("abc") must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.createComment("abc") must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.createComment("abc") must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.createComment("abc") must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.createComment("abc") must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.createComment("abc") must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.createComment("abc") must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.createComment("abc") must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createComment("abc") must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createComment("abc") must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createComment("abc") must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Range interface: existence and properties of interface object 
-PASS Range interface object length 
-PASS Range interface object name 
-FAIL Range interface: existence and properties of interface prototype object assert_equals: class string of Range.prototype expected "[object RangePrototype]" but got "[object Range]"
-PASS Range interface: existence and properties of interface prototype object's "constructor" property 
-PASS Range interface: attribute startContainer 
-PASS Range interface: attribute startOffset 
-PASS Range interface: attribute endContainer 
-PASS Range interface: attribute endOffset 
-PASS Range interface: attribute collapsed 
-PASS Range interface: attribute commonAncestorContainer 
-PASS Range interface: operation setStart(Node,unsigned long) 
-PASS Range interface: operation setEnd(Node,unsigned long) 
-PASS Range interface: operation setStartBefore(Node) 
-PASS Range interface: operation setStartAfter(Node) 
-PASS Range interface: operation setEndBefore(Node) 
-PASS Range interface: operation setEndAfter(Node) 
-PASS Range interface: operation collapse(boolean) 
-PASS Range interface: operation selectNode(Node) 
-PASS Range interface: operation selectNodeContents(Node) 
-PASS Range interface: constant START_TO_START on interface object 
-PASS Range interface: constant START_TO_START on interface prototype object 
-PASS Range interface: constant START_TO_END on interface object 
-PASS Range interface: constant START_TO_END on interface prototype object 
-PASS Range interface: constant END_TO_END on interface object 
-PASS Range interface: constant END_TO_END on interface prototype object 
-PASS Range interface: constant END_TO_START on interface object 
-PASS Range interface: constant END_TO_START on interface prototype object 
-PASS Range interface: operation compareBoundaryPoints(unsigned short,Range) 
-PASS Range interface: operation deleteContents() 
-PASS Range interface: operation extractContents() 
-PASS Range interface: operation cloneContents() 
-PASS Range interface: operation insertNode(Node) 
-PASS Range interface: operation surroundContents(Node) 
-PASS Range interface: operation cloneRange() 
-PASS Range interface: operation detach() 
-PASS Range interface: operation isPointInRange(Node,unsigned long) 
-PASS Range interface: operation comparePoint(Node,unsigned long) 
-PASS Range interface: operation intersectsNode(Node) 
-PASS Range interface: stringifier 
-PASS Range must be primary interface of document.createRange() 
-PASS Stringification of document.createRange() 
-PASS Range interface: document.createRange() must inherit property "startContainer" with the proper type (0) 
-PASS Range interface: document.createRange() must inherit property "startOffset" with the proper type (1) 
-PASS Range interface: document.createRange() must inherit property "endContainer" with the proper type (2) 
-PASS Range interface: document.createRange() must inherit property "endOffset" with the proper type (3) 
-PASS Range interface: document.createRange() must inherit property "collapsed" with the proper type (4) 
-PASS Range interface: document.createRange() must inherit property "commonAncestorContainer" with the proper type (5) 
-PASS Range interface: document.createRange() must inherit property "setStart" with the proper type (6) 
-PASS Range interface: calling setStart(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setEnd" with the proper type (7) 
-PASS Range interface: calling setEnd(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setStartBefore" with the proper type (8) 
-PASS Range interface: calling setStartBefore(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setStartAfter" with the proper type (9) 
-PASS Range interface: calling setStartAfter(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setEndBefore" with the proper type (10) 
-PASS Range interface: calling setEndBefore(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setEndAfter" with the proper type (11) 
-PASS Range interface: calling setEndAfter(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "collapse" with the proper type (12) 
-PASS Range interface: calling collapse(boolean) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "selectNode" with the proper type (13) 
-PASS Range interface: calling selectNode(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "selectNodeContents" with the proper type (14) 
-PASS Range interface: calling selectNodeContents(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "START_TO_START" with the proper type (15) 
-PASS Range interface: document.createRange() must inherit property "START_TO_END" with the proper type (16) 
-PASS Range interface: document.createRange() must inherit property "END_TO_END" with the proper type (17) 
-PASS Range interface: document.createRange() must inherit property "END_TO_START" with the proper type (18) 
-PASS Range interface: document.createRange() must inherit property "compareBoundaryPoints" with the proper type (19) 
-PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "deleteContents" with the proper type (20) 
-PASS Range interface: document.createRange() must inherit property "extractContents" with the proper type (21) 
-PASS Range interface: document.createRange() must inherit property "cloneContents" with the proper type (22) 
-PASS Range interface: document.createRange() must inherit property "insertNode" with the proper type (23) 
-PASS Range interface: calling insertNode(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "surroundContents" with the proper type (24) 
-PASS Range interface: calling surroundContents(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "cloneRange" with the proper type (25) 
-PASS Range interface: document.createRange() must inherit property "detach" with the proper type (26) 
-PASS Range interface: document.createRange() must inherit property "isPointInRange" with the proper type (27) 
-PASS Range interface: calling isPointInRange(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "comparePoint" with the proper type (28) 
-PASS Range interface: calling comparePoint(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "intersectsNode" with the proper type (29) 
-PASS Range interface: calling intersectsNode(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range must be primary interface of detachedRange 
-PASS Stringification of detachedRange 
-PASS Range interface: detachedRange must inherit property "startContainer" with the proper type (0) 
-PASS Range interface: detachedRange must inherit property "startOffset" with the proper type (1) 
-PASS Range interface: detachedRange must inherit property "endContainer" with the proper type (2) 
-PASS Range interface: detachedRange must inherit property "endOffset" with the proper type (3) 
-PASS Range interface: detachedRange must inherit property "collapsed" with the proper type (4) 
-PASS Range interface: detachedRange must inherit property "commonAncestorContainer" with the proper type (5) 
-PASS Range interface: detachedRange must inherit property "setStart" with the proper type (6) 
-PASS Range interface: calling setStart(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setEnd" with the proper type (7) 
-PASS Range interface: calling setEnd(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setStartBefore" with the proper type (8) 
-PASS Range interface: calling setStartBefore(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setStartAfter" with the proper type (9) 
-PASS Range interface: calling setStartAfter(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setEndBefore" with the proper type (10) 
-PASS Range interface: calling setEndBefore(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setEndAfter" with the proper type (11) 
-PASS Range interface: calling setEndAfter(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "collapse" with the proper type (12) 
-PASS Range interface: calling collapse(boolean) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "selectNode" with the proper type (13) 
-PASS Range interface: calling selectNode(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "selectNodeContents" with the proper type (14) 
-PASS Range interface: calling selectNodeContents(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "START_TO_START" with the proper type (15) 
-PASS Range interface: detachedRange must inherit property "START_TO_END" with the proper type (16) 
-PASS Range interface: detachedRange must inherit property "END_TO_END" with the proper type (17) 
-PASS Range interface: detachedRange must inherit property "END_TO_START" with the proper type (18) 
-PASS Range interface: detachedRange must inherit property "compareBoundaryPoints" with the proper type (19) 
-PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "deleteContents" with the proper type (20) 
-PASS Range interface: detachedRange must inherit property "extractContents" with the proper type (21) 
-PASS Range interface: detachedRange must inherit property "cloneContents" with the proper type (22) 
-PASS Range interface: detachedRange must inherit property "insertNode" with the proper type (23) 
-PASS Range interface: calling insertNode(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "surroundContents" with the proper type (24) 
-PASS Range interface: calling surroundContents(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "cloneRange" with the proper type (25) 
-PASS Range interface: detachedRange must inherit property "detach" with the proper type (26) 
-PASS Range interface: detachedRange must inherit property "isPointInRange" with the proper type (27) 
-PASS Range interface: calling isPointInRange(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "comparePoint" with the proper type (28) 
-PASS Range interface: calling comparePoint(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "intersectsNode" with the proper type (29) 
-PASS Range interface: calling intersectsNode(Node) on detachedRange with too few arguments must throw TypeError 
-PASS NodeIterator interface: existence and properties of interface object 
-PASS NodeIterator interface object length 
-PASS NodeIterator interface object name 
-FAIL NodeIterator interface: existence and properties of interface prototype object assert_equals: class string of NodeIterator.prototype expected "[object NodeIteratorPrototype]" but got "[object NodeIterator]"
-PASS NodeIterator interface: existence and properties of interface prototype object's "constructor" property 
-PASS NodeIterator interface: attribute root 
-PASS NodeIterator interface: attribute referenceNode 
-PASS NodeIterator interface: attribute pointerBeforeReferenceNode 
-PASS NodeIterator interface: attribute whatToShow 
-PASS NodeIterator interface: attribute filter 
-PASS NodeIterator interface: operation nextNode() 
-PASS NodeIterator interface: operation previousNode() 
-PASS NodeIterator interface: operation detach() 
-PASS NodeIterator must be primary interface of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS Stringification of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "referenceNode" with the proper type (1) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "pointerBeforeReferenceNode" with the proper type (2) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (3) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (4) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (5) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (6) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "detach" with the proper type (7) 
-PASS TreeWalker interface: existence and properties of interface object 
-PASS TreeWalker interface object length 
-PASS TreeWalker interface object name 
-FAIL TreeWalker interface: existence and properties of interface prototype object assert_equals: class string of TreeWalker.prototype expected "[object TreeWalkerPrototype]" but got "[object TreeWalker]"
-PASS TreeWalker interface: existence and properties of interface prototype object's "constructor" property 
-PASS TreeWalker interface: attribute root 
-PASS TreeWalker interface: attribute whatToShow 
-PASS TreeWalker interface: attribute filter 
-PASS TreeWalker interface: attribute currentNode 
-PASS TreeWalker interface: operation parentNode() 
-PASS TreeWalker interface: operation firstChild() 
-PASS TreeWalker interface: operation lastChild() 
-PASS TreeWalker interface: operation previousSibling() 
-PASS TreeWalker interface: operation nextSibling() 
-PASS TreeWalker interface: operation previousNode() 
-PASS TreeWalker interface: operation nextNode() 
-PASS TreeWalker must be primary interface of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS Stringification of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (1) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (2) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "currentNode" with the proper type (3) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "parentNode" with the proper type (4) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "firstChild" with the proper type (5) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "lastChild" with the proper type (6) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousSibling" with the proper type (7) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextSibling" with the proper type (8) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (9) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (10) 
-PASS NodeFilter interface: existence and properties of interface object 
-PASS NodeFilter interface object name 
-FAIL NodeFilter interface: existence and properties of interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-FAIL NodeFilter interface: existence and properties of interface prototype object's "constructor" property assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant FILTER_ACCEPT on interface object 
-FAIL NodeFilter interface: constant FILTER_ACCEPT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant FILTER_REJECT on interface object 
-FAIL NodeFilter interface: constant FILTER_REJECT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant FILTER_SKIP on interface object 
-FAIL NodeFilter interface: constant FILTER_SKIP on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ALL on interface object 
-FAIL NodeFilter interface: constant SHOW_ALL on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ELEMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_ELEMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ATTRIBUTE on interface object 
-FAIL NodeFilter interface: constant SHOW_ATTRIBUTE on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_TEXT on interface object 
-FAIL NodeFilter interface: constant SHOW_TEXT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_CDATA_SECTION on interface object 
-FAIL NodeFilter interface: constant SHOW_CDATA_SECTION on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface object 
-FAIL NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ENTITY on interface object 
-FAIL NodeFilter interface: constant SHOW_ENTITY on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface object 
-FAIL NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_COMMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_COMMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_DOCUMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_DOCUMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface object 
-FAIL NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_NOTATION on interface object 
-FAIL NodeFilter interface: constant SHOW_NOTATION on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-FAIL NodeFilter interface: operation acceptNode(Node) assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS DOMTokenList interface: existence and properties of interface object 
-PASS DOMTokenList interface object length 
-PASS DOMTokenList interface object name 
-FAIL DOMTokenList interface: existence and properties of interface prototype object assert_equals: class string of DOMTokenList.prototype expected "[object DOMTokenListPrototype]" but got "[object DOMTokenList]"
-PASS DOMTokenList interface: existence and properties of interface prototype object's "constructor" property 
-PASS DOMTokenList interface: attribute length 
-PASS DOMTokenList interface: operation item(unsigned long) 
-PASS DOMTokenList interface: operation contains(DOMString) 
-PASS DOMTokenList interface: operation add(DOMString) 
-PASS DOMTokenList interface: operation remove(DOMString) 
-PASS DOMTokenList interface: operation toggle(DOMString,boolean) 
-FAIL DOMTokenList interface: operation replace(DOMString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "replace" missing
-PASS DOMTokenList interface: operation supports(DOMString) 
-PASS DOMTokenList interface: attribute value 
-PASS DOMTokenList interface: stringifier 
-PASS DOMTokenList must be primary interface of document.body.classList 
-PASS Stringification of document.body.classList 
-PASS DOMTokenList interface: document.body.classList must inherit property "length" with the proper type (0) 
-PASS DOMTokenList interface: document.body.classList must inherit property "item" with the proper type (1) 
-PASS DOMTokenList interface: calling item(unsigned long) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "contains" with the proper type (2) 
-PASS DOMTokenList interface: calling contains(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "add" with the proper type (3) 
-PASS DOMTokenList interface: calling add(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "remove" with the proper type (4) 
-PASS DOMTokenList interface: calling remove(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "toggle" with the proper type (5) 
-PASS DOMTokenList interface: calling toggle(DOMString,boolean) on document.body.classList with too few arguments must throw TypeError 
-FAIL DOMTokenList interface: document.body.classList must inherit property "replace" with the proper type (6) assert_inherits: property "replace" not found in prototype chain
-FAIL DOMTokenList interface: calling replace(DOMString,DOMString) on document.body.classList with too few arguments must throw TypeError assert_inherits: property "replace" not found in prototype chain
-PASS DOMTokenList interface: document.body.classList must inherit property "supports" with the proper type (7) 
-PASS DOMTokenList interface: calling supports(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "value" with the proper type (8) 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt
index d473ca9..4453cee2 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt
@@ -15,11 +15,6 @@
           "object": "LayoutSVGContainer g id='content'",
           "rect": [16, 39, 784, 174],
           "reason": "became visible"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [0, 0, 334, 500],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-clipPath-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-clipPath-creation-expected.txt
index 2e225772..d9739c65 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-clipPath-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-clipPath-creation-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGContainer g id='content'",
           "rect": [16, 39, 784, 174],
           "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [0, 0, 334, 500],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt
index b96d2d2..91bc7f5 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt
@@ -10,26 +10,6 @@
           "object": "LayoutSVGContainer g id='content'",
           "rect": [0, 14, 678, 366],
           "reason": "became visible"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [16, 16, 18, 18],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [16, 16, 18, 18],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [8, 8, 17, 17],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [8, 8, 17, 17],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-pattern-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-pattern-creation-expected.txt
index 6d48b34e..62684bf0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-pattern-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/js-late-pattern-creation-expected.txt
@@ -10,16 +10,6 @@
           "object": "LayoutSVGText text",
           "rect": [33, 22, 618, 196],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [16, 25, 18, 25],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [8, 12, 17, 26],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/tabgroup-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/tabgroup-expected.txt
index 556d0fd..d159495 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/tabgroup-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/tabgroup-expected.txt
@@ -57,6 +57,11 @@
           "reason": "became visible"
         },
         {
+          "object": "LayoutSVGRect rect",
+          "rect": [30, 188, 240, 12],
+          "reason": "layoutObject removal"
+        },
+        {
           "object": "LayoutSVGPath path",
           "rect": [506, 233, 238, 159],
           "reason": "layoutObject insertion"
@@ -108,32 +113,32 @@
         },
         {
           "object": "LayoutSVGRect rect",
-          "rect": [31, 404, 188, 10],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [23, 146, 188, 10],
+          "rect": [39, 189, 222, 122],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGRect rect",
-          "rect": [30, 147, 175, 97],
+          "rect": [40, 188, 220, 122],
           "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [38, 405, 174, 96],
-          "reason": "layoutObject insertion"
+          "object": "LayoutSVGInlineText #text",
+          "rect": [10, 44, 188, 29],
+          "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [39, 404, 172, 96],
-          "reason": "layoutObject insertion"
+          "object": "LayoutSVGInlineText #text",
+          "rect": [10, 44, 188, 29],
+          "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [31, 146, 172, 96],
+          "object": "LayoutSVGTSpan tspan",
+          "rect": [10, 44, 188, 29],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGText text",
+          "rect": [10, 44, 188, 29],
           "reason": "layoutObject removal"
         },
         {
@@ -162,31 +167,6 @@
           "reason": "became visible"
         },
         {
-          "object": "LayoutSVGText text",
-          "rect": [15, 292, 148, 23],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [7, 34, 148, 23],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [7, 34, 148, 23],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGTSpan tspan",
-          "rect": [7, 34, 148, 23],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGText text",
-          "rect": [7, 34, 148, 23],
-          "reason": "layoutObject removal"
-        },
-        {
           "object": "LayoutSVGPath path id='tabgroupRectRound__0'",
           "rect": [362, 279, 63, 62],
           "reason": "layoutObject insertion"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/text-mask-update-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/text-mask-update-expected.txt
index b9b46f3..1b09dbd 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/text-mask-update-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/text-mask-update-expected.txt
@@ -12,21 +12,11 @@
           "reason": "style change"
         },
         {
-          "object": "LayoutSVGText text id='text1'",
-          "rect": [10, 2, 46, 23],
-          "reason": "style change"
-        },
-        {
           "object": "LayoutSVGInlineText #text",
           "rect": [10, 32, 43, 23],
           "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGText text id='text2'",
-          "rect": [10, 32, 43, 23],
-          "reason": "full"
-        },
-        {
           "object": "LayoutSVGRect rect",
           "rect": [10, 32, 43, 18],
           "reason": "full"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/use-detach-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/use-detach-expected.txt
index 252f840..98146a6 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/use-detach-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/use-detach-expected.txt
@@ -24,31 +24,6 @@
         {
           "object": "LayoutSVGContainer use",
           "rect": [210, 58, 44, 38],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [210, 58, 44, 38],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [210, 58, 44, 38],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [210, 58, 44, 38],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [210, 58, 44, 38],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [210, 58, 44, 38],
           "reason": "layoutObject removal"
         },
         {
@@ -62,73 +37,83 @@
           "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGText text id='use_text'",
-          "rect": [210, 58, 44, 38],
+          "object": "LayoutSVGContainer use",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGEllipse circle id='use_circle'",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGEllipse circle id='use_circle'",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGEllipse circle id='use_circle'",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [41, 19, 18, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [41, 19, 18, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGInlineText #text",
+          "rect": [41, 19, 18, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGInlineText #text",
+          "rect": [41, 19, 18, 16],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGText text id='use_text'",
-          "rect": [210, 58, 44, 38],
+          "rect": [41, 19, 18, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGText text id='use_text'",
+          "rect": [41, 19, 18, 16],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         }
       ]
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt
deleted file mode 100644
index 53c250d..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt
+++ /dev/null
@@ -1,1613 +0,0 @@
-This is a testharness.js-based test.
-Found 1609 tests; 1428 PASS, 181 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Event interface: existence and properties of interface object 
-PASS Event interface object length 
-PASS Event interface object name 
-FAIL Event interface: existence and properties of interface prototype object assert_equals: class string of Event.prototype expected "[object EventPrototype]" but got "[object Event]"
-PASS Event interface: existence and properties of interface prototype object's "constructor" property 
-PASS Event interface: attribute type 
-PASS Event interface: attribute target 
-PASS Event interface: attribute currentTarget 
-PASS Event interface: constant NONE on interface object 
-PASS Event interface: constant NONE on interface prototype object 
-PASS Event interface: constant CAPTURING_PHASE on interface object 
-PASS Event interface: constant CAPTURING_PHASE on interface prototype object 
-PASS Event interface: constant AT_TARGET on interface object 
-PASS Event interface: constant AT_TARGET on interface prototype object 
-PASS Event interface: constant BUBBLING_PHASE on interface object 
-PASS Event interface: constant BUBBLING_PHASE on interface prototype object 
-PASS Event interface: attribute eventPhase 
-PASS Event interface: operation stopPropagation() 
-PASS Event interface: operation stopImmediatePropagation() 
-PASS Event interface: attribute bubbles 
-PASS Event interface: attribute cancelable 
-PASS Event interface: operation preventDefault() 
-PASS Event interface: attribute defaultPrevented 
-PASS Event interface: attribute timeStamp 
-PASS Event interface: operation initEvent(DOMString,boolean,boolean) 
-PASS Event must be primary interface of document.createEvent("Event") 
-PASS Stringification of document.createEvent("Event") 
-PASS Event interface: document.createEvent("Event") must inherit property "type" with the proper type (0) 
-PASS Event interface: document.createEvent("Event") must inherit property "target" with the proper type (1) 
-PASS Event interface: document.createEvent("Event") must inherit property "currentTarget" with the proper type (2) 
-PASS Event interface: document.createEvent("Event") must inherit property "NONE" with the proper type (3) 
-PASS Event interface: document.createEvent("Event") must inherit property "CAPTURING_PHASE" with the proper type (4) 
-PASS Event interface: document.createEvent("Event") must inherit property "AT_TARGET" with the proper type (5) 
-PASS Event interface: document.createEvent("Event") must inherit property "BUBBLING_PHASE" with the proper type (6) 
-PASS Event interface: document.createEvent("Event") must inherit property "eventPhase" with the proper type (7) 
-PASS Event interface: document.createEvent("Event") must inherit property "stopPropagation" with the proper type (8) 
-PASS Event interface: document.createEvent("Event") must inherit property "stopImmediatePropagation" with the proper type (9) 
-PASS Event interface: document.createEvent("Event") must inherit property "bubbles" with the proper type (10) 
-PASS Event interface: document.createEvent("Event") must inherit property "cancelable" with the proper type (11) 
-PASS Event interface: document.createEvent("Event") must inherit property "preventDefault" with the proper type (12) 
-PASS Event interface: document.createEvent("Event") must inherit property "defaultPrevented" with the proper type (13) 
-PASS Event interface: document.createEvent("Event") must have own property "isTrusted" 
-PASS Event interface: document.createEvent("Event") must inherit property "timeStamp" with the proper type (15) 
-PASS Event interface: document.createEvent("Event") must inherit property "initEvent" with the proper type (16) 
-PASS Event interface: calling initEvent(DOMString,boolean,boolean) on document.createEvent("Event") with too few arguments must throw TypeError 
-PASS Event must be primary interface of new Event("foo") 
-PASS Stringification of new Event("foo") 
-PASS Event interface: new Event("foo") must inherit property "type" with the proper type (0) 
-PASS Event interface: new Event("foo") must inherit property "target" with the proper type (1) 
-PASS Event interface: new Event("foo") must inherit property "currentTarget" with the proper type (2) 
-PASS Event interface: new Event("foo") must inherit property "NONE" with the proper type (3) 
-PASS Event interface: new Event("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) 
-PASS Event interface: new Event("foo") must inherit property "AT_TARGET" with the proper type (5) 
-PASS Event interface: new Event("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) 
-PASS Event interface: new Event("foo") must inherit property "eventPhase" with the proper type (7) 
-PASS Event interface: new Event("foo") must inherit property "stopPropagation" with the proper type (8) 
-PASS Event interface: new Event("foo") must inherit property "stopImmediatePropagation" with the proper type (9) 
-PASS Event interface: new Event("foo") must inherit property "bubbles" with the proper type (10) 
-PASS Event interface: new Event("foo") must inherit property "cancelable" with the proper type (11) 
-PASS Event interface: new Event("foo") must inherit property "preventDefault" with the proper type (12) 
-PASS Event interface: new Event("foo") must inherit property "defaultPrevented" with the proper type (13) 
-PASS Event interface: new Event("foo") must have own property "isTrusted" 
-PASS Event interface: new Event("foo") must inherit property "timeStamp" with the proper type (15) 
-PASS Event interface: new Event("foo") must inherit property "initEvent" with the proper type (16) 
-PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new Event("foo") with too few arguments must throw TypeError 
-PASS CustomEvent interface: existence and properties of interface object 
-PASS CustomEvent interface object length 
-PASS CustomEvent interface object name 
-FAIL CustomEvent interface: existence and properties of interface prototype object assert_equals: class string of CustomEvent.prototype expected "[object CustomEventPrototype]" but got "[object CustomEvent]"
-PASS CustomEvent interface: existence and properties of interface prototype object's "constructor" property 
-PASS CustomEvent interface: attribute detail 
-PASS CustomEvent interface: operation initCustomEvent(DOMString,boolean,boolean,any) 
-PASS CustomEvent must be primary interface of new CustomEvent("foo") 
-PASS Stringification of new CustomEvent("foo") 
-PASS CustomEvent interface: new CustomEvent("foo") must inherit property "detail" with the proper type (0) 
-PASS CustomEvent interface: new CustomEvent("foo") must inherit property "initCustomEvent" with the proper type (1) 
-PASS CustomEvent interface: calling initCustomEvent(DOMString,boolean,boolean,any) on new CustomEvent("foo") with too few arguments must throw TypeError 
-PASS Event interface: new CustomEvent("foo") must inherit property "type" with the proper type (0) 
-PASS Event interface: new CustomEvent("foo") must inherit property "target" with the proper type (1) 
-PASS Event interface: new CustomEvent("foo") must inherit property "currentTarget" with the proper type (2) 
-PASS Event interface: new CustomEvent("foo") must inherit property "NONE" with the proper type (3) 
-PASS Event interface: new CustomEvent("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) 
-PASS Event interface: new CustomEvent("foo") must inherit property "AT_TARGET" with the proper type (5) 
-PASS Event interface: new CustomEvent("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) 
-PASS Event interface: new CustomEvent("foo") must inherit property "eventPhase" with the proper type (7) 
-PASS Event interface: new CustomEvent("foo") must inherit property "stopPropagation" with the proper type (8) 
-PASS Event interface: new CustomEvent("foo") must inherit property "stopImmediatePropagation" with the proper type (9) 
-PASS Event interface: new CustomEvent("foo") must inherit property "bubbles" with the proper type (10) 
-PASS Event interface: new CustomEvent("foo") must inherit property "cancelable" with the proper type (11) 
-PASS Event interface: new CustomEvent("foo") must inherit property "preventDefault" with the proper type (12) 
-PASS Event interface: new CustomEvent("foo") must inherit property "defaultPrevented" with the proper type (13) 
-PASS Event interface: new CustomEvent("foo") must have own property "isTrusted" 
-PASS Event interface: new CustomEvent("foo") must inherit property "timeStamp" with the proper type (15) 
-PASS Event interface: new CustomEvent("foo") must inherit property "initEvent" with the proper type (16) 
-PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new CustomEvent("foo") with too few arguments must throw TypeError 
-PASS EventTarget interface: existence and properties of interface object 
-PASS EventTarget interface object length 
-PASS EventTarget interface object name 
-FAIL EventTarget interface: existence and properties of interface prototype object assert_equals: class string of EventTarget.prototype expected "[object EventTargetPrototype]" but got "[object EventTarget]"
-PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property 
-PASS EventTarget interface: operation addEventListener(DOMString,EventListener,[object Object],[object Object]) 
-PASS EventTarget interface: operation removeEventListener(DOMString,EventListener,[object Object],[object Object]) 
-PASS EventTarget interface: operation dispatchEvent(Event) 
-PASS EventListener interface: existence and properties of interface object 
-PASS EventListener interface: existence and properties of interface prototype object 
-PASS EventListener interface: existence and properties of interface prototype object's "constructor" property 
-PASS EventListener interface: operation handleEvent(Event) 
-PASS NodeList interface: existence and properties of interface object 
-PASS NodeList interface object length 
-PASS NodeList interface object name 
-FAIL NodeList interface: existence and properties of interface prototype object assert_equals: class string of NodeList.prototype expected "[object NodeListPrototype]" but got "[object NodeList]"
-PASS NodeList interface: existence and properties of interface prototype object's "constructor" property 
-PASS NodeList interface: operation item(unsigned long) 
-PASS NodeList interface: attribute length 
-PASS NodeList must be primary interface of document.querySelectorAll("script") 
-PASS Stringification of document.querySelectorAll("script") 
-PASS NodeList interface: document.querySelectorAll("script") must inherit property "item" with the proper type (0) 
-PASS NodeList interface: calling item(unsigned long) on document.querySelectorAll("script") with too few arguments must throw TypeError 
-PASS NodeList interface: document.querySelectorAll("script") must inherit property "length" with the proper type (1) 
-PASS HTMLCollection interface: existence and properties of interface object 
-PASS HTMLCollection interface object length 
-PASS HTMLCollection interface object name 
-FAIL HTMLCollection interface: existence and properties of interface prototype object assert_equals: class string of HTMLCollection.prototype expected "[object HTMLCollectionPrototype]" but got "[object HTMLCollection]"
-PASS HTMLCollection interface: existence and properties of interface prototype object's "constructor" property 
-PASS HTMLCollection interface: attribute length 
-PASS HTMLCollection interface: operation item(unsigned long) 
-PASS HTMLCollection interface: operation namedItem(DOMString) 
-PASS HTMLCollection must be primary interface of document.body.children 
-PASS Stringification of document.body.children 
-PASS HTMLCollection interface: document.body.children must inherit property "length" with the proper type (0) 
-PASS HTMLCollection interface: document.body.children must inherit property "item" with the proper type (1) 
-PASS HTMLCollection interface: calling item(unsigned long) on document.body.children with too few arguments must throw TypeError 
-PASS HTMLCollection interface: document.body.children must inherit property "namedItem" with the proper type (2) 
-PASS HTMLCollection interface: calling namedItem(DOMString) on document.body.children with too few arguments must throw TypeError 
-PASS MutationObserver interface: existence and properties of interface object 
-PASS MutationObserver interface object length 
-PASS MutationObserver interface object name 
-FAIL MutationObserver interface: existence and properties of interface prototype object assert_equals: class string of MutationObserver.prototype expected "[object MutationObserverPrototype]" but got "[object MutationObserver]"
-PASS MutationObserver interface: existence and properties of interface prototype object's "constructor" property 
-PASS MutationObserver interface: operation observe(Node,MutationObserverInit) 
-PASS MutationObserver interface: operation disconnect() 
-PASS MutationObserver interface: operation takeRecords() 
-PASS MutationRecord interface: existence and properties of interface object 
-PASS MutationRecord interface object length 
-PASS MutationRecord interface object name 
-FAIL MutationRecord interface: existence and properties of interface prototype object assert_equals: class string of MutationRecord.prototype expected "[object MutationRecordPrototype]" but got "[object MutationRecord]"
-PASS MutationRecord interface: existence and properties of interface prototype object's "constructor" property 
-PASS MutationRecord interface: attribute type 
-PASS MutationRecord interface: attribute target 
-PASS MutationRecord interface: attribute addedNodes 
-PASS MutationRecord interface: attribute removedNodes 
-PASS MutationRecord interface: attribute previousSibling 
-PASS MutationRecord interface: attribute nextSibling 
-PASS MutationRecord interface: attribute attributeName 
-PASS MutationRecord interface: attribute attributeNamespace 
-PASS MutationRecord interface: attribute oldValue 
-PASS Node interface: existence and properties of interface object 
-PASS Node interface object length 
-PASS Node interface object name 
-FAIL Node interface: existence and properties of interface prototype object assert_equals: class string of Node.prototype expected "[object NodePrototype]" but got "[object Node]"
-PASS Node interface: existence and properties of interface prototype object's "constructor" property 
-PASS Node interface: constant ELEMENT_NODE on interface object 
-PASS Node interface: constant ELEMENT_NODE on interface prototype object 
-PASS Node interface: constant ATTRIBUTE_NODE on interface object 
-PASS Node interface: constant ATTRIBUTE_NODE on interface prototype object 
-PASS Node interface: constant TEXT_NODE on interface object 
-PASS Node interface: constant TEXT_NODE on interface prototype object 
-PASS Node interface: constant CDATA_SECTION_NODE on interface object 
-PASS Node interface: constant CDATA_SECTION_NODE on interface prototype object 
-PASS Node interface: constant ENTITY_REFERENCE_NODE on interface object 
-PASS Node interface: constant ENTITY_REFERENCE_NODE on interface prototype object 
-PASS Node interface: constant ENTITY_NODE on interface object 
-PASS Node interface: constant ENTITY_NODE on interface prototype object 
-PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface object 
-PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface prototype object 
-PASS Node interface: constant COMMENT_NODE on interface object 
-PASS Node interface: constant COMMENT_NODE on interface prototype object 
-PASS Node interface: constant DOCUMENT_NODE on interface object 
-PASS Node interface: constant DOCUMENT_NODE on interface prototype object 
-PASS Node interface: constant DOCUMENT_TYPE_NODE on interface object 
-PASS Node interface: constant DOCUMENT_TYPE_NODE on interface prototype object 
-PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface object 
-PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface prototype object 
-PASS Node interface: constant NOTATION_NODE on interface object 
-PASS Node interface: constant NOTATION_NODE on interface prototype object 
-PASS Node interface: attribute nodeType 
-PASS Node interface: attribute nodeName 
-PASS Node interface: attribute baseURI 
-PASS Node interface: attribute isConnected 
-PASS Node interface: attribute ownerDocument 
-PASS Node interface: operation getRootNode(GetRootNodeOptions) 
-PASS Node interface: attribute parentNode 
-PASS Node interface: attribute parentElement 
-PASS Node interface: operation hasChildNodes() 
-PASS Node interface: attribute childNodes 
-PASS Node interface: attribute firstChild 
-PASS Node interface: attribute lastChild 
-PASS Node interface: attribute previousSibling 
-PASS Node interface: attribute nextSibling 
-PASS Node interface: attribute nodeValue 
-PASS Node interface: attribute textContent 
-PASS Node interface: operation normalize() 
-PASS Node interface: operation cloneNode(boolean) 
-PASS Node interface: operation isEqualNode(Node) 
-PASS Node interface: operation isSameNode(Node) 
-PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface prototype object 
-PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface object 
-PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface prototype object 
-PASS Node interface: operation compareDocumentPosition(Node) 
-PASS Node interface: operation contains(Node) 
-PASS Node interface: operation lookupPrefix(DOMString) 
-PASS Node interface: operation lookupNamespaceURI(DOMString) 
-PASS Node interface: operation isDefaultNamespace(DOMString) 
-PASS Node interface: operation insertBefore(Node,Node) 
-PASS Node interface: operation appendChild(Node) 
-PASS Node interface: operation replaceChild(Node,Node) 
-PASS Node interface: operation removeChild(Node) 
-PASS Document interface: existence and properties of interface object 
-PASS Document interface object length 
-PASS Document interface object name 
-FAIL Document interface: existence and properties of interface prototype object assert_equals: class string of Document.prototype expected "[object DocumentPrototype]" but got "[object Document]"
-PASS Document interface: existence and properties of interface prototype object's "constructor" property 
-PASS Document interface: attribute implementation 
-PASS Document interface: attribute URL 
-PASS Document interface: attribute documentURI 
-PASS Document interface: attribute origin 
-PASS Document interface: attribute compatMode 
-PASS Document interface: attribute characterSet 
-PASS Document interface: attribute charset 
-PASS Document interface: attribute inputEncoding 
-PASS Document interface: attribute contentType 
-PASS Document interface: attribute doctype 
-PASS Document interface: attribute documentElement 
-PASS Document interface: operation getElementsByTagName(DOMString) 
-PASS Document interface: operation getElementsByTagNameNS(DOMString,DOMString) 
-PASS Document interface: operation getElementsByClassName(DOMString) 
-PASS Document interface: operation createElement(DOMString,ElementCreationOptions) 
-PASS Document interface: operation createElementNS(DOMString,DOMString,ElementCreationOptions) 
-PASS Document interface: operation createDocumentFragment() 
-PASS Document interface: operation createTextNode(DOMString) 
-PASS Document interface: operation createCDATASection(DOMString) 
-PASS Document interface: operation createComment(DOMString) 
-PASS Document interface: operation createProcessingInstruction(DOMString,DOMString) 
-PASS Document interface: operation importNode(Node,boolean) 
-PASS Document interface: operation adoptNode(Node) 
-PASS Document interface: operation createAttribute(DOMString) 
-PASS Document interface: operation createAttributeNS(DOMString,DOMString) 
-PASS Document interface: operation createEvent(DOMString) 
-PASS Document interface: operation createRange() 
-PASS Document interface: operation createNodeIterator(Node,unsigned long,NodeFilter) 
-PASS Document interface: operation createTreeWalker(Node,unsigned long,NodeFilter) 
-PASS Document interface: operation getElementById(DOMString) 
-PASS Document interface: attribute children 
-PASS Document interface: attribute firstElementChild 
-PASS Document interface: attribute lastElementChild 
-PASS Document interface: attribute childElementCount 
-PASS Document interface: operation prepend([object Object],[object Object]) 
-PASS Document interface: operation append([object Object],[object Object]) 
-PASS Document interface: operation querySelector(DOMString) 
-PASS Document interface: operation querySelectorAll(DOMString) 
-FAIL Document must be primary interface of new Document() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Stringification of new Document() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "implementation" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "URL" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "documentURI" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "origin" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "compatMode" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "characterSet" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "charset" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "inputEncoding" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "contentType" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "doctype" with the proper type (9) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "documentElement" with the proper type (10) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementsByTagName" with the proper type (11) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementsByTagName(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementsByTagNameNS" with the proper type (12) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementsByClassName" with the proper type (13) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementsByClassName(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createElement" with the proper type (14) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createElement(DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createElementNS" with the proper type (15) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createDocumentFragment" with the proper type (16) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createTextNode" with the proper type (17) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createTextNode(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createCDATASection" with the proper type (18) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createCDATASection(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createComment" with the proper type (19) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createComment(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createProcessingInstruction" with the proper type (20) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createProcessingInstruction(DOMString,DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "importNode" with the proper type (21) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling importNode(Node,boolean) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "adoptNode" with the proper type (22) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling adoptNode(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createAttribute" with the proper type (23) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createAttribute(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createAttributeNS" with the proper type (24) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createAttributeNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createEvent" with the proper type (25) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createEvent(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createRange" with the proper type (26) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createNodeIterator" with the proper type (27) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "createTreeWalker" with the proper type (28) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "getElementById" with the proper type (29) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling getElementById(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "children" with the proper type (30) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "firstElementChild" with the proper type (31) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "lastElementChild" with the proper type (32) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "childElementCount" with the proper type (33) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "prepend" with the proper type (34) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling prepend([object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "append" with the proper type (35) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling append([object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "querySelector" with the proper type (36) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling querySelector(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: new Document() must inherit property "querySelectorAll" with the proper type (37) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Document interface: calling querySelectorAll(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ELEMENT_NODE" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ATTRIBUTE_NODE" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "TEXT_NODE" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "CDATA_SECTION_NODE" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ENTITY_NODE" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "COMMENT_NODE" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_NODE" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "NOTATION_NODE" with the proper type (11) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nodeType" with the proper type (12) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nodeName" with the proper type (13) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "baseURI" with the proper type (14) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isConnected" with the proper type (15) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "ownerDocument" with the proper type (16) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "getRootNode" with the proper type (17) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling getRootNode(GetRootNodeOptions) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "parentNode" with the proper type (18) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "parentElement" with the proper type (19) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "hasChildNodes" with the proper type (20) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "childNodes" with the proper type (21) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "firstChild" with the proper type (22) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "lastChild" with the proper type (23) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "previousSibling" with the proper type (24) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nextSibling" with the proper type (25) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "nodeValue" with the proper type (26) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "textContent" with the proper type (27) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "normalize" with the proper type (28) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "cloneNode" with the proper type (29) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling cloneNode(boolean) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isEqualNode" with the proper type (30) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling isEqualNode(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isSameNode" with the proper type (31) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling isSameNode(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "compareDocumentPosition" with the proper type (38) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling compareDocumentPosition(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "contains" with the proper type (39) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling contains(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "lookupPrefix" with the proper type (40) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling lookupPrefix(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "lookupNamespaceURI" with the proper type (41) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling lookupNamespaceURI(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "isDefaultNamespace" with the proper type (42) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling isDefaultNamespace(DOMString) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "insertBefore" with the proper type (43) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling insertBefore(Node,Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "appendChild" with the proper type (44) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling appendChild(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "replaceChild" with the proper type (45) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling replaceChild(Node,Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: new Document() must inherit property "removeChild" with the proper type (46) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL Node interface: calling removeChild(Node) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new Document() must inherit property "addEventListener" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new Document() must inherit property "removeEventListener" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new Document() must inherit property "dispatchEvent" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: calling dispatchEvent(Event) on new Document() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-PASS XMLDocument interface: existence and properties of interface object 
-PASS XMLDocument interface object length 
-PASS XMLDocument interface object name 
-FAIL XMLDocument interface: existence and properties of interface prototype object assert_equals: class string of XMLDocument.prototype expected "[object XMLDocumentPrototype]" but got "[object XMLDocument]"
-PASS XMLDocument interface: existence and properties of interface prototype object's "constructor" property 
-PASS XMLDocument must be primary interface of xmlDoc 
-PASS Stringification of xmlDoc 
-PASS Document interface: xmlDoc must inherit property "implementation" with the proper type (0) 
-PASS Document interface: xmlDoc must inherit property "URL" with the proper type (1) 
-FAIL Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) assert_equals: expected "string" but got "object"
-PASS Document interface: xmlDoc must inherit property "origin" with the proper type (3) 
-PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type (4) 
-PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type (5) 
-PASS Document interface: xmlDoc must inherit property "charset" with the proper type (6) 
-PASS Document interface: xmlDoc must inherit property "inputEncoding" with the proper type (7) 
-PASS Document interface: xmlDoc must inherit property "contentType" with the proper type (8) 
-PASS Document interface: xmlDoc must inherit property "doctype" with the proper type (9) 
-PASS Document interface: xmlDoc must inherit property "documentElement" with the proper type (10) 
-PASS Document interface: xmlDoc must inherit property "getElementsByTagName" with the proper type (11) 
-PASS Document interface: calling getElementsByTagName(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "getElementsByTagNameNS" with the proper type (12) 
-PASS Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "getElementsByClassName" with the proper type (13) 
-PASS Document interface: calling getElementsByClassName(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createElement" with the proper type (14) 
-PASS Document interface: calling createElement(DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createElementNS" with the proper type (15) 
-PASS Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createDocumentFragment" with the proper type (16) 
-PASS Document interface: xmlDoc must inherit property "createTextNode" with the proper type (17) 
-PASS Document interface: calling createTextNode(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createCDATASection" with the proper type (18) 
-PASS Document interface: calling createCDATASection(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createComment" with the proper type (19) 
-PASS Document interface: calling createComment(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createProcessingInstruction" with the proper type (20) 
-PASS Document interface: calling createProcessingInstruction(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "importNode" with the proper type (21) 
-PASS Document interface: calling importNode(Node,boolean) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "adoptNode" with the proper type (22) 
-PASS Document interface: calling adoptNode(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createAttribute" with the proper type (23) 
-PASS Document interface: calling createAttribute(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createAttributeNS" with the proper type (24) 
-PASS Document interface: calling createAttributeNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createEvent" with the proper type (25) 
-PASS Document interface: calling createEvent(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createRange" with the proper type (26) 
-PASS Document interface: xmlDoc must inherit property "createNodeIterator" with the proper type (27) 
-PASS Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "createTreeWalker" with the proper type (28) 
-PASS Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "getElementById" with the proper type (29) 
-PASS Document interface: calling getElementById(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "children" with the proper type (30) 
-PASS Document interface: xmlDoc must inherit property "firstElementChild" with the proper type (31) 
-PASS Document interface: xmlDoc must inherit property "lastElementChild" with the proper type (32) 
-PASS Document interface: xmlDoc must inherit property "childElementCount" with the proper type (33) 
-PASS Document interface: xmlDoc must inherit property "prepend" with the proper type (34) 
-PASS Document interface: calling prepend([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "append" with the proper type (35) 
-PASS Document interface: calling append([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "querySelector" with the proper type (36) 
-PASS Document interface: calling querySelector(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Document interface: xmlDoc must inherit property "querySelectorAll" with the proper type (37) 
-PASS Document interface: calling querySelectorAll(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: xmlDoc must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: xmlDoc must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: xmlDoc must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: xmlDoc must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: xmlDoc must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: xmlDoc must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: xmlDoc must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: xmlDoc must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: xmlDoc must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: xmlDoc must inherit property "nodeName" with the proper type (13) 
-FAIL Node interface: xmlDoc must inherit property "baseURI" with the proper type (14) assert_equals: expected "string" but got "object"
-PASS Node interface: xmlDoc must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: xmlDoc must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: xmlDoc must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: xmlDoc must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: xmlDoc must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: xmlDoc must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: xmlDoc must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: xmlDoc must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: xmlDoc must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: xmlDoc must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: xmlDoc must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: xmlDoc must inherit property "textContent" with the proper type (27) 
-PASS Node interface: xmlDoc must inherit property "normalize" with the proper type (28) 
-PASS Node interface: xmlDoc must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: xmlDoc must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on xmlDoc with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on xmlDoc with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc with too few arguments must throw TypeError 
-PASS DOMImplementation interface: existence and properties of interface object 
-PASS DOMImplementation interface object length 
-PASS DOMImplementation interface object name 
-FAIL DOMImplementation interface: existence and properties of interface prototype object assert_equals: class string of DOMImplementation.prototype expected "[object DOMImplementationPrototype]" but got "[object DOMImplementation]"
-PASS DOMImplementation interface: existence and properties of interface prototype object's "constructor" property 
-PASS DOMImplementation interface: operation createDocumentType(DOMString,DOMString,DOMString) 
-PASS DOMImplementation interface: operation createDocument(DOMString,DOMString,DocumentType) 
-PASS DOMImplementation interface: operation createHTMLDocument(DOMString) 
-PASS DOMImplementation interface: operation hasFeature() 
-PASS DOMImplementation must be primary interface of document.implementation 
-PASS Stringification of document.implementation 
-PASS DOMImplementation interface: document.implementation must inherit property "createDocumentType" with the proper type (0) 
-PASS DOMImplementation interface: calling createDocumentType(DOMString,DOMString,DOMString) on document.implementation with too few arguments must throw TypeError 
-PASS DOMImplementation interface: document.implementation must inherit property "createDocument" with the proper type (1) 
-PASS DOMImplementation interface: calling createDocument(DOMString,DOMString,DocumentType) on document.implementation with too few arguments must throw TypeError 
-PASS DOMImplementation interface: document.implementation must inherit property "createHTMLDocument" with the proper type (2) 
-PASS DOMImplementation interface: calling createHTMLDocument(DOMString) on document.implementation with too few arguments must throw TypeError 
-PASS DOMImplementation interface: document.implementation must inherit property "hasFeature" with the proper type (3) 
-PASS DocumentType interface: existence and properties of interface object 
-PASS DocumentType interface object length 
-PASS DocumentType interface object name 
-FAIL DocumentType interface: existence and properties of interface prototype object assert_equals: class string of DocumentType.prototype expected "[object DocumentTypePrototype]" but got "[object DocumentType]"
-PASS DocumentType interface: existence and properties of interface prototype object's "constructor" property 
-PASS DocumentType interface: attribute name 
-PASS DocumentType interface: attribute publicId 
-PASS DocumentType interface: attribute systemId 
-PASS DocumentType interface: operation before([object Object],[object Object]) 
-PASS DocumentType interface: operation after([object Object],[object Object]) 
-PASS DocumentType interface: operation replaceWith([object Object],[object Object]) 
-PASS DocumentType interface: operation remove() 
-PASS DocumentType must be primary interface of document.doctype 
-PASS Stringification of document.doctype 
-PASS DocumentType interface: document.doctype must inherit property "name" with the proper type (0) 
-PASS DocumentType interface: document.doctype must inherit property "publicId" with the proper type (1) 
-PASS DocumentType interface: document.doctype must inherit property "systemId" with the proper type (2) 
-PASS DocumentType interface: document.doctype must inherit property "before" with the proper type (3) 
-PASS DocumentType interface: calling before([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentType interface: document.doctype must inherit property "after" with the proper type (4) 
-PASS DocumentType interface: calling after([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentType interface: document.doctype must inherit property "replaceWith" with the proper type (5) 
-PASS DocumentType interface: calling replaceWith([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentType interface: document.doctype must inherit property "remove" with the proper type (6) 
-PASS Node interface: document.doctype must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.doctype must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.doctype must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.doctype must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.doctype must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.doctype must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.doctype must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.doctype must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.doctype must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.doctype must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.doctype must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.doctype must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.doctype must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.doctype must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.doctype must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.doctype must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.doctype must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.doctype must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.doctype must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.doctype must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.doctype must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.doctype must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.doctype must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.doctype must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.doctype must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.doctype must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.doctype must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.doctype with too few arguments must throw TypeError 
-PASS Node interface: document.doctype must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.doctype with too few arguments must throw TypeError 
-PASS EventTarget interface: document.doctype must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS EventTarget interface: document.doctype must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
-PASS EventTarget interface: document.doctype must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.doctype with too few arguments must throw TypeError 
-PASS DocumentFragment interface: existence and properties of interface object 
-PASS DocumentFragment interface object length 
-PASS DocumentFragment interface object name 
-FAIL DocumentFragment interface: existence and properties of interface prototype object assert_equals: class string of DocumentFragment.prototype expected "[object DocumentFragmentPrototype]" but got "[object DocumentFragment]"
-PASS DocumentFragment interface: existence and properties of interface prototype object's "constructor" property 
-PASS DocumentFragment interface: operation getElementById(DOMString) 
-PASS DocumentFragment interface: attribute children 
-PASS DocumentFragment interface: attribute firstElementChild 
-PASS DocumentFragment interface: attribute lastElementChild 
-PASS DocumentFragment interface: attribute childElementCount 
-PASS DocumentFragment interface: operation prepend([object Object],[object Object]) 
-PASS DocumentFragment interface: operation append([object Object],[object Object]) 
-PASS DocumentFragment interface: operation querySelector(DOMString) 
-PASS DocumentFragment interface: operation querySelectorAll(DOMString) 
-PASS DocumentFragment must be primary interface of document.createDocumentFragment() 
-PASS Stringification of document.createDocumentFragment() 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "getElementById" with the proper type (0) 
-PASS DocumentFragment interface: calling getElementById(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "children" with the proper type (1) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "firstElementChild" with the proper type (2) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "lastElementChild" with the proper type (3) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "childElementCount" with the proper type (4) 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "prepend" with the proper type (5) 
-PASS DocumentFragment interface: calling prepend([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "append" with the proper type (6) 
-PASS DocumentFragment interface: calling append([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelector" with the proper type (7) 
-PASS DocumentFragment interface: calling querySelector(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelectorAll" with the proper type (8) 
-PASS DocumentFragment interface: calling querySelectorAll(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.createDocumentFragment() must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.createDocumentFragment() must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.createDocumentFragment() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.createDocumentFragment() must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.createDocumentFragment() must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.createDocumentFragment() must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.createDocumentFragment() must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.createDocumentFragment() must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.createDocumentFragment() must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.createDocumentFragment() must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.createDocumentFragment() must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.createDocumentFragment() must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.createDocumentFragment() must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.createDocumentFragment() must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.createDocumentFragment() must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.createDocumentFragment() must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.createDocumentFragment() must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.createDocumentFragment() must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.createDocumentFragment() must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.createDocumentFragment() must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS Node interface: document.createDocumentFragment() must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createDocumentFragment() must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createDocumentFragment() must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createDocumentFragment() must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.createDocumentFragment() with too few arguments must throw TypeError 
-PASS ShadowRoot interface: existence and properties of interface object 
-PASS ShadowRoot interface object length 
-PASS ShadowRoot interface object name 
-FAIL ShadowRoot interface: existence and properties of interface prototype object assert_equals: class string of ShadowRoot.prototype expected "[object ShadowRootPrototype]" but got "[object ShadowRoot]"
-PASS ShadowRoot interface: existence and properties of interface prototype object's "constructor" property 
-PASS ShadowRoot interface: attribute mode 
-PASS ShadowRoot interface: attribute host 
-PASS Element interface: existence and properties of interface object 
-PASS Element interface object length 
-PASS Element interface object name 
-FAIL Element interface: existence and properties of interface prototype object assert_equals: class string of Element.prototype expected "[object ElementPrototype]" but got "[object Element]"
-PASS Element interface: existence and properties of interface prototype object's "constructor" property 
-PASS Element interface: attribute namespaceURI 
-PASS Element interface: attribute prefix 
-PASS Element interface: attribute localName 
-PASS Element interface: attribute tagName 
-PASS Element interface: attribute id 
-PASS Element interface: attribute className 
-PASS Element interface: attribute classList 
-PASS Element interface: attribute slot 
-PASS Element interface: operation hasAttributes() 
-PASS Element interface: attribute attributes 
-FAIL Element interface: operation getAttributeNames() assert_own_property: interface prototype object missing non-static operation expected property "getAttributeNames" missing
-PASS Element interface: operation getAttribute(DOMString) 
-PASS Element interface: operation getAttributeNS(DOMString,DOMString) 
-PASS Element interface: operation setAttribute(DOMString,DOMString) 
-PASS Element interface: operation setAttributeNS(DOMString,DOMString,DOMString) 
-PASS Element interface: operation removeAttribute(DOMString) 
-PASS Element interface: operation removeAttributeNS(DOMString,DOMString) 
-PASS Element interface: operation hasAttribute(DOMString) 
-PASS Element interface: operation hasAttributeNS(DOMString,DOMString) 
-PASS Element interface: operation getAttributeNode(DOMString) 
-PASS Element interface: operation getAttributeNodeNS(DOMString,DOMString) 
-PASS Element interface: operation setAttributeNode(Attr) 
-PASS Element interface: operation setAttributeNodeNS(Attr) 
-PASS Element interface: operation removeAttributeNode(Attr) 
-PASS Element interface: operation attachShadow(ShadowRootInit) 
-PASS Element interface: attribute shadowRoot 
-PASS Element interface: operation closest(DOMString) 
-PASS Element interface: operation matches(DOMString) 
-PASS Element interface: operation webkitMatchesSelector(DOMString) 
-PASS Element interface: operation getElementsByTagName(DOMString) 
-PASS Element interface: operation getElementsByTagNameNS(DOMString,DOMString) 
-PASS Element interface: operation getElementsByClassName(DOMString) 
-PASS Element interface: operation insertAdjacentElement(DOMString,Element) 
-PASS Element interface: operation insertAdjacentText(DOMString,DOMString) 
-PASS Element interface: attribute children 
-PASS Element interface: attribute firstElementChild 
-PASS Element interface: attribute lastElementChild 
-PASS Element interface: attribute childElementCount 
-PASS Element interface: operation prepend([object Object],[object Object]) 
-PASS Element interface: operation append([object Object],[object Object]) 
-PASS Element interface: operation querySelector(DOMString) 
-PASS Element interface: operation querySelectorAll(DOMString) 
-PASS Element interface: attribute previousElementSibling 
-PASS Element interface: attribute nextElementSibling 
-PASS Element interface: operation before([object Object],[object Object]) 
-PASS Element interface: operation after([object Object],[object Object]) 
-PASS Element interface: operation replaceWith([object Object],[object Object]) 
-PASS Element interface: operation remove() 
-PASS Element interface: attribute assignedSlot 
-PASS Element must be primary interface of element 
-PASS Stringification of element 
-PASS Element interface: element must inherit property "namespaceURI" with the proper type (0) 
-PASS Element interface: element must inherit property "prefix" with the proper type (1) 
-PASS Element interface: element must inherit property "localName" with the proper type (2) 
-PASS Element interface: element must inherit property "tagName" with the proper type (3) 
-PASS Element interface: element must inherit property "id" with the proper type (4) 
-PASS Element interface: element must inherit property "className" with the proper type (5) 
-PASS Element interface: element must inherit property "classList" with the proper type (6) 
-PASS Element interface: element must inherit property "slot" with the proper type (7) 
-PASS Element interface: element must inherit property "hasAttributes" with the proper type (8) 
-PASS Element interface: element must inherit property "attributes" with the proper type (9) 
-FAIL Element interface: element must inherit property "getAttributeNames" with the proper type (10) assert_inherits: property "getAttributeNames" not found in prototype chain
-PASS Element interface: element must inherit property "getAttribute" with the proper type (11) 
-PASS Element interface: calling getAttribute(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getAttributeNS" with the proper type (12) 
-PASS Element interface: calling getAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttribute" with the proper type (13) 
-PASS Element interface: calling setAttribute(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttributeNS" with the proper type (14) 
-PASS Element interface: calling setAttributeNS(DOMString,DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "removeAttribute" with the proper type (15) 
-PASS Element interface: calling removeAttribute(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "removeAttributeNS" with the proper type (16) 
-PASS Element interface: calling removeAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "hasAttribute" with the proper type (17) 
-PASS Element interface: calling hasAttribute(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "hasAttributeNS" with the proper type (18) 
-PASS Element interface: calling hasAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getAttributeNode" with the proper type (19) 
-PASS Element interface: calling getAttributeNode(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getAttributeNodeNS" with the proper type (20) 
-PASS Element interface: calling getAttributeNodeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttributeNode" with the proper type (21) 
-PASS Element interface: calling setAttributeNode(Attr) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "setAttributeNodeNS" with the proper type (22) 
-PASS Element interface: calling setAttributeNodeNS(Attr) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "removeAttributeNode" with the proper type (23) 
-PASS Element interface: calling removeAttributeNode(Attr) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "attachShadow" with the proper type (24) 
-PASS Element interface: calling attachShadow(ShadowRootInit) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "shadowRoot" with the proper type (25) 
-PASS Element interface: element must inherit property "closest" with the proper type (26) 
-PASS Element interface: calling closest(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "matches" with the proper type (27) 
-PASS Element interface: calling matches(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "webkitMatchesSelector" with the proper type (28) 
-PASS Element interface: calling webkitMatchesSelector(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getElementsByTagName" with the proper type (29) 
-PASS Element interface: calling getElementsByTagName(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getElementsByTagNameNS" with the proper type (30) 
-PASS Element interface: calling getElementsByTagNameNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "getElementsByClassName" with the proper type (31) 
-PASS Element interface: calling getElementsByClassName(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "insertAdjacentElement" with the proper type (32) 
-PASS Element interface: calling insertAdjacentElement(DOMString,Element) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "insertAdjacentText" with the proper type (33) 
-PASS Element interface: calling insertAdjacentText(DOMString,DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "children" with the proper type (34) 
-PASS Element interface: element must inherit property "firstElementChild" with the proper type (35) 
-PASS Element interface: element must inherit property "lastElementChild" with the proper type (36) 
-PASS Element interface: element must inherit property "childElementCount" with the proper type (37) 
-PASS Element interface: element must inherit property "prepend" with the proper type (38) 
-PASS Element interface: calling prepend([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "append" with the proper type (39) 
-PASS Element interface: calling append([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "querySelector" with the proper type (40) 
-PASS Element interface: calling querySelector(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "querySelectorAll" with the proper type (41) 
-PASS Element interface: calling querySelectorAll(DOMString) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "previousElementSibling" with the proper type (42) 
-PASS Element interface: element must inherit property "nextElementSibling" with the proper type (43) 
-PASS Element interface: element must inherit property "before" with the proper type (44) 
-PASS Element interface: calling before([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "after" with the proper type (45) 
-PASS Element interface: calling after([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "replaceWith" with the proper type (46) 
-PASS Element interface: calling replaceWith([object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS Element interface: element must inherit property "remove" with the proper type (47) 
-PASS Element interface: element must inherit property "assignedSlot" with the proper type (48) 
-PASS Node interface: element must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: element must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: element must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: element must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: element must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: element must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: element must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: element must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: element must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: element must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: element must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: element must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: element must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: element must inherit property "nodeName" with the proper type (13) 
-FAIL Node interface: element must inherit property "baseURI" with the proper type (14) assert_equals: expected "string" but got "object"
-PASS Node interface: element must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: element must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: element must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: element must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: element must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: element must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: element must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: element must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: element must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: element must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: element must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: element must inherit property "textContent" with the proper type (27) 
-PASS Node interface: element must inherit property "normalize" with the proper type (28) 
-PASS Node interface: element must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: element must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: element must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on element with too few arguments must throw TypeError 
-PASS Node interface: element must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on element with too few arguments must throw TypeError 
-PASS EventTarget interface: element must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS EventTarget interface: element must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError 
-PASS EventTarget interface: element must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on element with too few arguments must throw TypeError 
-PASS NamedNodeMap interface: existence and properties of interface object 
-PASS NamedNodeMap interface object length 
-PASS NamedNodeMap interface object name 
-FAIL NamedNodeMap interface: existence and properties of interface prototype object assert_equals: class string of NamedNodeMap.prototype expected "[object NamedNodeMapPrototype]" but got "[object NamedNodeMap]"
-PASS NamedNodeMap interface: existence and properties of interface prototype object's "constructor" property 
-PASS NamedNodeMap interface: attribute length 
-PASS NamedNodeMap interface: operation item(unsigned long) 
-PASS NamedNodeMap interface: operation getNamedItem(DOMString) 
-PASS NamedNodeMap interface: operation getNamedItemNS(DOMString,DOMString) 
-PASS NamedNodeMap interface: operation setNamedItem(Attr) 
-PASS NamedNodeMap interface: operation setNamedItemNS(Attr) 
-PASS NamedNodeMap interface: operation removeNamedItem(DOMString) 
-PASS NamedNodeMap interface: operation removeNamedItemNS(DOMString,DOMString) 
-PASS Attr interface: existence and properties of interface object 
-PASS Attr interface object length 
-PASS Attr interface object name 
-FAIL Attr interface: existence and properties of interface prototype object assert_equals: class string of Attr.prototype expected "[object AttrPrototype]" but got "[object Attr]"
-PASS Attr interface: existence and properties of interface prototype object's "constructor" property 
-PASS Attr interface: attribute namespaceURI 
-PASS Attr interface: attribute prefix 
-PASS Attr interface: attribute localName 
-PASS Attr interface: attribute name 
-PASS Attr interface: attribute value 
-PASS Attr interface: attribute ownerElement 
-PASS Attr interface: attribute specified 
-PASS Attr must be primary interface of document.querySelector("[id]").attributes[0] 
-PASS Stringification of document.querySelector("[id]").attributes[0] 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "namespaceURI" with the proper type (0) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "prefix" with the proper type (1) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "localName" with the proper type (2) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "name" with the proper type (3) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "value" with the proper type (4) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "ownerElement" with the proper type (5) 
-PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "specified" with the proper type (6) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
-PASS CharacterData interface: existence and properties of interface object 
-PASS CharacterData interface object length 
-PASS CharacterData interface object name 
-FAIL CharacterData interface: existence and properties of interface prototype object assert_equals: class string of CharacterData.prototype expected "[object CharacterDataPrototype]" but got "[object CharacterData]"
-PASS CharacterData interface: existence and properties of interface prototype object's "constructor" property 
-PASS CharacterData interface: attribute data 
-PASS CharacterData interface: attribute length 
-PASS CharacterData interface: operation substringData(unsigned long,unsigned long) 
-PASS CharacterData interface: operation appendData(DOMString) 
-PASS CharacterData interface: operation insertData(unsigned long,DOMString) 
-PASS CharacterData interface: operation deleteData(unsigned long,unsigned long) 
-PASS CharacterData interface: operation replaceData(unsigned long,unsigned long,DOMString) 
-PASS CharacterData interface: attribute previousElementSibling 
-PASS CharacterData interface: attribute nextElementSibling 
-PASS CharacterData interface: operation before([object Object],[object Object]) 
-PASS CharacterData interface: operation after([object Object],[object Object]) 
-PASS CharacterData interface: operation replaceWith([object Object],[object Object]) 
-PASS CharacterData interface: operation remove() 
-PASS Text interface: existence and properties of interface object 
-PASS Text interface object length 
-PASS Text interface object name 
-FAIL Text interface: existence and properties of interface prototype object assert_equals: class string of Text.prototype expected "[object TextPrototype]" but got "[object Text]"
-PASS Text interface: existence and properties of interface prototype object's "constructor" property 
-PASS Text interface: operation splitText(unsigned long) 
-PASS Text interface: attribute wholeText 
-PASS Text interface: attribute assignedSlot 
-PASS Text must be primary interface of document.createTextNode("abc") 
-PASS Stringification of document.createTextNode("abc") 
-PASS Text interface: document.createTextNode("abc") must inherit property "splitText" with the proper type (0) 
-PASS Text interface: calling splitText(unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Text interface: document.createTextNode("abc") must inherit property "wholeText" with the proper type (1) 
-PASS Text interface: document.createTextNode("abc") must inherit property "assignedSlot" with the proper type (2) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "data" with the proper type (0) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "length" with the proper type (1) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "substringData" with the proper type (2) 
-PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "appendData" with the proper type (3) 
-PASS CharacterData interface: calling appendData(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "insertData" with the proper type (4) 
-PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "deleteData" with the proper type (5) 
-PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceData" with the proper type (6) 
-PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "previousElementSibling" with the proper type (7) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "nextElementSibling" with the proper type (8) 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "before" with the proper type (9) 
-PASS CharacterData interface: calling before([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "after" with the proper type (10) 
-PASS CharacterData interface: calling after([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceWith" with the proper type (11) 
-PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createTextNode("abc") must inherit property "remove" with the proper type (12) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.createTextNode("abc") must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.createTextNode("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.createTextNode("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.createTextNode("abc") must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.createTextNode("abc") must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.createTextNode("abc") must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.createTextNode("abc") must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.createTextNode("abc") must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.createTextNode("abc") must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.createTextNode("abc") must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.createTextNode("abc") must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.createTextNode("abc") must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.createTextNode("abc") must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.createTextNode("abc") must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.createTextNode("abc") must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.createTextNode("abc") must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.createTextNode("abc") must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.createTextNode("abc") must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.createTextNode("abc") must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.createTextNode("abc") must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createTextNode("abc") must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createTextNode("abc") must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createTextNode("abc") must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createTextNode("abc") must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.createTextNode("abc") with too few arguments must throw TypeError 
-PASS CDATASection interface: existence and properties of interface object 
-PASS CDATASection interface object length 
-PASS CDATASection interface object name 
-FAIL CDATASection interface: existence and properties of interface prototype object assert_equals: class string of CDATASection.prototype expected "[object CDATASectionPrototype]" but got "[object CDATASection]"
-PASS CDATASection interface: existence and properties of interface prototype object's "constructor" property 
-PASS ProcessingInstruction interface: existence and properties of interface object 
-PASS ProcessingInstruction interface object length 
-PASS ProcessingInstruction interface object name 
-FAIL ProcessingInstruction interface: existence and properties of interface prototype object assert_equals: class string of ProcessingInstruction.prototype expected "[object ProcessingInstructionPrototype]" but got "[object ProcessingInstruction]"
-PASS ProcessingInstruction interface: existence and properties of interface prototype object's "constructor" property 
-PASS ProcessingInstruction interface: attribute target 
-PASS ProcessingInstruction must be primary interface of xmlDoc.createProcessingInstruction("abc", "def") 
-PASS Stringification of xmlDoc.createProcessingInstruction("abc", "def") 
-PASS ProcessingInstruction interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "target" with the proper type (0) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "data" with the proper type (0) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "length" with the proper type (1) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "substringData" with the proper type (2) 
-PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendData" with the proper type (3) 
-PASS CharacterData interface: calling appendData(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertData" with the proper type (4) 
-PASS CharacterData interface: calling insertData(unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "deleteData" with the proper type (5) 
-PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceData" with the proper type (6) 
-PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousElementSibling" with the proper type (7) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextElementSibling" with the proper type (8) 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "before" with the proper type (9) 
-PASS CharacterData interface: calling before([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "after" with the proper type (10) 
-PASS CharacterData interface: calling after([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceWith" with the proper type (11) 
-PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "remove" with the proper type (12) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeName" with the proper type (13) 
-FAIL Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "baseURI" with the proper type (14) assert_equals: expected "string" but got "object"
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "textContent" with the proper type (27) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "normalize" with the proper type (28) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
-PASS Comment interface: existence and properties of interface object 
-PASS Comment interface object length 
-PASS Comment interface object name 
-FAIL Comment interface: existence and properties of interface prototype object assert_equals: class string of Comment.prototype expected "[object CommentPrototype]" but got "[object Comment]"
-PASS Comment interface: existence and properties of interface prototype object's "constructor" property 
-PASS Comment must be primary interface of document.createComment("abc") 
-PASS Stringification of document.createComment("abc") 
-PASS CharacterData interface: document.createComment("abc") must inherit property "data" with the proper type (0) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "length" with the proper type (1) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "substringData" with the proper type (2) 
-PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "appendData" with the proper type (3) 
-PASS CharacterData interface: calling appendData(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "insertData" with the proper type (4) 
-PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "deleteData" with the proper type (5) 
-PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "replaceData" with the proper type (6) 
-PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "previousElementSibling" with the proper type (7) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "nextElementSibling" with the proper type (8) 
-PASS CharacterData interface: document.createComment("abc") must inherit property "before" with the proper type (9) 
-PASS CharacterData interface: calling before([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "after" with the proper type (10) 
-PASS CharacterData interface: calling after([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "replaceWith" with the proper type (11) 
-PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS CharacterData interface: document.createComment("abc") must inherit property "remove" with the proper type (12) 
-PASS Node interface: document.createComment("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: document.createComment("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: document.createComment("abc") must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: document.createComment("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: document.createComment("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: document.createComment("abc") must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: document.createComment("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: document.createComment("abc") must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: document.createComment("abc") must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: document.createComment("abc") must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: document.createComment("abc") must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: document.createComment("abc") must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: document.createComment("abc") must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: document.createComment("abc") must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: document.createComment("abc") must inherit property "getRootNode" with the proper type (17) 
-PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: document.createComment("abc") must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: document.createComment("abc") must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: document.createComment("abc") must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: document.createComment("abc") must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: document.createComment("abc") must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: document.createComment("abc") must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: document.createComment("abc") must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: document.createComment("abc") must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: document.createComment("abc") must inherit property "textContent" with the proper type (27) 
-PASS Node interface: document.createComment("abc") must inherit property "normalize" with the proper type (28) 
-PASS Node interface: document.createComment("abc") must inherit property "cloneNode" with the proper type (29) 
-PASS Node interface: calling cloneNode(boolean) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "isEqualNode" with the proper type (30) 
-PASS Node interface: calling isEqualNode(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "isSameNode" with the proper type (31) 
-PASS Node interface: calling isSameNode(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: document.createComment("abc") must inherit property "compareDocumentPosition" with the proper type (38) 
-PASS Node interface: calling compareDocumentPosition(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "contains" with the proper type (39) 
-PASS Node interface: calling contains(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "lookupPrefix" with the proper type (40) 
-PASS Node interface: calling lookupPrefix(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "lookupNamespaceURI" with the proper type (41) 
-PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "isDefaultNamespace" with the proper type (42) 
-PASS Node interface: calling isDefaultNamespace(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "appendChild" with the proper type (44) 
-PASS Node interface: calling appendChild(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Node interface: document.createComment("abc") must inherit property "removeChild" with the proper type (46) 
-PASS Node interface: calling removeChild(Node) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createComment("abc") must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createComment("abc") must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS EventTarget interface: document.createComment("abc") must inherit property "dispatchEvent" with the proper type (2) 
-PASS EventTarget interface: calling dispatchEvent(Event) on document.createComment("abc") with too few arguments must throw TypeError 
-PASS Range interface: existence and properties of interface object 
-PASS Range interface object length 
-PASS Range interface object name 
-FAIL Range interface: existence and properties of interface prototype object assert_equals: class string of Range.prototype expected "[object RangePrototype]" but got "[object Range]"
-PASS Range interface: existence and properties of interface prototype object's "constructor" property 
-PASS Range interface: attribute startContainer 
-PASS Range interface: attribute startOffset 
-PASS Range interface: attribute endContainer 
-PASS Range interface: attribute endOffset 
-PASS Range interface: attribute collapsed 
-PASS Range interface: attribute commonAncestorContainer 
-PASS Range interface: operation setStart(Node,unsigned long) 
-PASS Range interface: operation setEnd(Node,unsigned long) 
-PASS Range interface: operation setStartBefore(Node) 
-PASS Range interface: operation setStartAfter(Node) 
-PASS Range interface: operation setEndBefore(Node) 
-PASS Range interface: operation setEndAfter(Node) 
-PASS Range interface: operation collapse(boolean) 
-PASS Range interface: operation selectNode(Node) 
-PASS Range interface: operation selectNodeContents(Node) 
-PASS Range interface: constant START_TO_START on interface object 
-PASS Range interface: constant START_TO_START on interface prototype object 
-PASS Range interface: constant START_TO_END on interface object 
-PASS Range interface: constant START_TO_END on interface prototype object 
-PASS Range interface: constant END_TO_END on interface object 
-PASS Range interface: constant END_TO_END on interface prototype object 
-PASS Range interface: constant END_TO_START on interface object 
-PASS Range interface: constant END_TO_START on interface prototype object 
-PASS Range interface: operation compareBoundaryPoints(unsigned short,Range) 
-PASS Range interface: operation deleteContents() 
-PASS Range interface: operation extractContents() 
-PASS Range interface: operation cloneContents() 
-PASS Range interface: operation insertNode(Node) 
-PASS Range interface: operation surroundContents(Node) 
-PASS Range interface: operation cloneRange() 
-PASS Range interface: operation detach() 
-PASS Range interface: operation isPointInRange(Node,unsigned long) 
-PASS Range interface: operation comparePoint(Node,unsigned long) 
-PASS Range interface: operation intersectsNode(Node) 
-PASS Range interface: stringifier 
-PASS Range must be primary interface of document.createRange() 
-PASS Stringification of document.createRange() 
-PASS Range interface: document.createRange() must inherit property "startContainer" with the proper type (0) 
-PASS Range interface: document.createRange() must inherit property "startOffset" with the proper type (1) 
-PASS Range interface: document.createRange() must inherit property "endContainer" with the proper type (2) 
-PASS Range interface: document.createRange() must inherit property "endOffset" with the proper type (3) 
-PASS Range interface: document.createRange() must inherit property "collapsed" with the proper type (4) 
-PASS Range interface: document.createRange() must inherit property "commonAncestorContainer" with the proper type (5) 
-PASS Range interface: document.createRange() must inherit property "setStart" with the proper type (6) 
-PASS Range interface: calling setStart(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setEnd" with the proper type (7) 
-PASS Range interface: calling setEnd(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setStartBefore" with the proper type (8) 
-PASS Range interface: calling setStartBefore(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setStartAfter" with the proper type (9) 
-PASS Range interface: calling setStartAfter(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setEndBefore" with the proper type (10) 
-PASS Range interface: calling setEndBefore(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "setEndAfter" with the proper type (11) 
-PASS Range interface: calling setEndAfter(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "collapse" with the proper type (12) 
-PASS Range interface: calling collapse(boolean) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "selectNode" with the proper type (13) 
-PASS Range interface: calling selectNode(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "selectNodeContents" with the proper type (14) 
-PASS Range interface: calling selectNodeContents(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "START_TO_START" with the proper type (15) 
-PASS Range interface: document.createRange() must inherit property "START_TO_END" with the proper type (16) 
-PASS Range interface: document.createRange() must inherit property "END_TO_END" with the proper type (17) 
-PASS Range interface: document.createRange() must inherit property "END_TO_START" with the proper type (18) 
-PASS Range interface: document.createRange() must inherit property "compareBoundaryPoints" with the proper type (19) 
-PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "deleteContents" with the proper type (20) 
-PASS Range interface: document.createRange() must inherit property "extractContents" with the proper type (21) 
-PASS Range interface: document.createRange() must inherit property "cloneContents" with the proper type (22) 
-PASS Range interface: document.createRange() must inherit property "insertNode" with the proper type (23) 
-PASS Range interface: calling insertNode(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "surroundContents" with the proper type (24) 
-PASS Range interface: calling surroundContents(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "cloneRange" with the proper type (25) 
-PASS Range interface: document.createRange() must inherit property "detach" with the proper type (26) 
-PASS Range interface: document.createRange() must inherit property "isPointInRange" with the proper type (27) 
-PASS Range interface: calling isPointInRange(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "comparePoint" with the proper type (28) 
-PASS Range interface: calling comparePoint(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
-PASS Range interface: document.createRange() must inherit property "intersectsNode" with the proper type (29) 
-PASS Range interface: calling intersectsNode(Node) on document.createRange() with too few arguments must throw TypeError 
-PASS Range must be primary interface of detachedRange 
-PASS Stringification of detachedRange 
-PASS Range interface: detachedRange must inherit property "startContainer" with the proper type (0) 
-PASS Range interface: detachedRange must inherit property "startOffset" with the proper type (1) 
-PASS Range interface: detachedRange must inherit property "endContainer" with the proper type (2) 
-PASS Range interface: detachedRange must inherit property "endOffset" with the proper type (3) 
-PASS Range interface: detachedRange must inherit property "collapsed" with the proper type (4) 
-PASS Range interface: detachedRange must inherit property "commonAncestorContainer" with the proper type (5) 
-PASS Range interface: detachedRange must inherit property "setStart" with the proper type (6) 
-PASS Range interface: calling setStart(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setEnd" with the proper type (7) 
-PASS Range interface: calling setEnd(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setStartBefore" with the proper type (8) 
-PASS Range interface: calling setStartBefore(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setStartAfter" with the proper type (9) 
-PASS Range interface: calling setStartAfter(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setEndBefore" with the proper type (10) 
-PASS Range interface: calling setEndBefore(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "setEndAfter" with the proper type (11) 
-PASS Range interface: calling setEndAfter(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "collapse" with the proper type (12) 
-PASS Range interface: calling collapse(boolean) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "selectNode" with the proper type (13) 
-PASS Range interface: calling selectNode(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "selectNodeContents" with the proper type (14) 
-PASS Range interface: calling selectNodeContents(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "START_TO_START" with the proper type (15) 
-PASS Range interface: detachedRange must inherit property "START_TO_END" with the proper type (16) 
-PASS Range interface: detachedRange must inherit property "END_TO_END" with the proper type (17) 
-PASS Range interface: detachedRange must inherit property "END_TO_START" with the proper type (18) 
-PASS Range interface: detachedRange must inherit property "compareBoundaryPoints" with the proper type (19) 
-PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "deleteContents" with the proper type (20) 
-PASS Range interface: detachedRange must inherit property "extractContents" with the proper type (21) 
-PASS Range interface: detachedRange must inherit property "cloneContents" with the proper type (22) 
-PASS Range interface: detachedRange must inherit property "insertNode" with the proper type (23) 
-PASS Range interface: calling insertNode(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "surroundContents" with the proper type (24) 
-PASS Range interface: calling surroundContents(Node) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "cloneRange" with the proper type (25) 
-PASS Range interface: detachedRange must inherit property "detach" with the proper type (26) 
-PASS Range interface: detachedRange must inherit property "isPointInRange" with the proper type (27) 
-PASS Range interface: calling isPointInRange(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "comparePoint" with the proper type (28) 
-PASS Range interface: calling comparePoint(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
-PASS Range interface: detachedRange must inherit property "intersectsNode" with the proper type (29) 
-PASS Range interface: calling intersectsNode(Node) on detachedRange with too few arguments must throw TypeError 
-PASS NodeIterator interface: existence and properties of interface object 
-PASS NodeIterator interface object length 
-PASS NodeIterator interface object name 
-FAIL NodeIterator interface: existence and properties of interface prototype object assert_equals: class string of NodeIterator.prototype expected "[object NodeIteratorPrototype]" but got "[object NodeIterator]"
-PASS NodeIterator interface: existence and properties of interface prototype object's "constructor" property 
-PASS NodeIterator interface: attribute root 
-PASS NodeIterator interface: attribute referenceNode 
-PASS NodeIterator interface: attribute pointerBeforeReferenceNode 
-PASS NodeIterator interface: attribute whatToShow 
-PASS NodeIterator interface: attribute filter 
-PASS NodeIterator interface: operation nextNode() 
-PASS NodeIterator interface: operation previousNode() 
-PASS NodeIterator interface: operation detach() 
-PASS NodeIterator must be primary interface of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS Stringification of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "referenceNode" with the proper type (1) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "pointerBeforeReferenceNode" with the proper type (2) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (3) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (4) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (5) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (6) 
-PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "detach" with the proper type (7) 
-PASS TreeWalker interface: existence and properties of interface object 
-PASS TreeWalker interface object length 
-PASS TreeWalker interface object name 
-FAIL TreeWalker interface: existence and properties of interface prototype object assert_equals: class string of TreeWalker.prototype expected "[object TreeWalkerPrototype]" but got "[object TreeWalker]"
-PASS TreeWalker interface: existence and properties of interface prototype object's "constructor" property 
-PASS TreeWalker interface: attribute root 
-PASS TreeWalker interface: attribute whatToShow 
-PASS TreeWalker interface: attribute filter 
-PASS TreeWalker interface: attribute currentNode 
-PASS TreeWalker interface: operation parentNode() 
-PASS TreeWalker interface: operation firstChild() 
-PASS TreeWalker interface: operation lastChild() 
-PASS TreeWalker interface: operation previousSibling() 
-PASS TreeWalker interface: operation nextSibling() 
-PASS TreeWalker interface: operation previousNode() 
-PASS TreeWalker interface: operation nextNode() 
-PASS TreeWalker must be primary interface of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS Stringification of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (1) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (2) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "currentNode" with the proper type (3) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "parentNode" with the proper type (4) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "firstChild" with the proper type (5) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "lastChild" with the proper type (6) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousSibling" with the proper type (7) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextSibling" with the proper type (8) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (9) 
-PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (10) 
-PASS NodeFilter interface: existence and properties of interface object 
-PASS NodeFilter interface object name 
-FAIL NodeFilter interface: existence and properties of interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-FAIL NodeFilter interface: existence and properties of interface prototype object's "constructor" property assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant FILTER_ACCEPT on interface object 
-FAIL NodeFilter interface: constant FILTER_ACCEPT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant FILTER_REJECT on interface object 
-FAIL NodeFilter interface: constant FILTER_REJECT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant FILTER_SKIP on interface object 
-FAIL NodeFilter interface: constant FILTER_SKIP on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ALL on interface object 
-FAIL NodeFilter interface: constant SHOW_ALL on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ELEMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_ELEMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ATTRIBUTE on interface object 
-FAIL NodeFilter interface: constant SHOW_ATTRIBUTE on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_TEXT on interface object 
-FAIL NodeFilter interface: constant SHOW_TEXT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_CDATA_SECTION on interface object 
-FAIL NodeFilter interface: constant SHOW_CDATA_SECTION on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface object 
-FAIL NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_ENTITY on interface object 
-FAIL NodeFilter interface: constant SHOW_ENTITY on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface object 
-FAIL NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_COMMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_COMMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_DOCUMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_DOCUMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface object 
-FAIL NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface object 
-FAIL NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS NodeFilter interface: constant SHOW_NOTATION on interface object 
-FAIL NodeFilter interface: constant SHOW_NOTATION on interface prototype object assert_false: NodeFilter should not have a "prototype" property expected false got true
-FAIL NodeFilter interface: operation acceptNode(Node) assert_false: NodeFilter should not have a "prototype" property expected false got true
-PASS DOMTokenList interface: existence and properties of interface object 
-PASS DOMTokenList interface object length 
-PASS DOMTokenList interface object name 
-FAIL DOMTokenList interface: existence and properties of interface prototype object assert_equals: class string of DOMTokenList.prototype expected "[object DOMTokenListPrototype]" but got "[object DOMTokenList]"
-PASS DOMTokenList interface: existence and properties of interface prototype object's "constructor" property 
-PASS DOMTokenList interface: attribute length 
-PASS DOMTokenList interface: operation item(unsigned long) 
-PASS DOMTokenList interface: operation contains(DOMString) 
-PASS DOMTokenList interface: operation add(DOMString) 
-PASS DOMTokenList interface: operation remove(DOMString) 
-PASS DOMTokenList interface: operation toggle(DOMString,boolean) 
-FAIL DOMTokenList interface: operation replace(DOMString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "replace" missing
-PASS DOMTokenList interface: operation supports(DOMString) 
-PASS DOMTokenList interface: attribute value 
-PASS DOMTokenList interface: stringifier 
-PASS DOMTokenList must be primary interface of document.body.classList 
-PASS Stringification of document.body.classList 
-PASS DOMTokenList interface: document.body.classList must inherit property "length" with the proper type (0) 
-PASS DOMTokenList interface: document.body.classList must inherit property "item" with the proper type (1) 
-PASS DOMTokenList interface: calling item(unsigned long) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "contains" with the proper type (2) 
-PASS DOMTokenList interface: calling contains(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "add" with the proper type (3) 
-PASS DOMTokenList interface: calling add(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "remove" with the proper type (4) 
-PASS DOMTokenList interface: calling remove(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "toggle" with the proper type (5) 
-PASS DOMTokenList interface: calling toggle(DOMString,boolean) on document.body.classList with too few arguments must throw TypeError 
-FAIL DOMTokenList interface: document.body.classList must inherit property "replace" with the proper type (6) assert_inherits: property "replace" not found in prototype chain
-FAIL DOMTokenList interface: calling replace(DOMString,DOMString) on document.body.classList with too few arguments must throw TypeError assert_inherits: property "replace" not found in prototype chain
-PASS DOMTokenList interface: document.body.classList must inherit property "supports" with the proper type (7) 
-PASS DOMTokenList interface: calling supports(DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "value" with the proper type (8) 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
new file mode 100644
index 0000000..4d3c843
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.txt
new file mode 100644
index 0000000..bdaf3ac
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.txt
@@ -0,0 +1,5 @@
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt
index d5f541b..980f6c1 100644
--- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.txt
@@ -15,11 +15,6 @@
           "object": "LayoutSVGContainer g id='content'",
           "rect": [16, 40, 784, 168],
           "reason": "became visible"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [0, 0, 334, 500],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-clipPath-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-clipPath-creation-expected.txt
index 1346bd3..1cf5553 100644
--- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-clipPath-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-clipPath-creation-expected.txt
@@ -10,11 +10,6 @@
           "object": "LayoutSVGContainer g id='content'",
           "rect": [16, 40, 784, 168],
           "reason": "bounds change"
-        },
-        {
-          "object": "LayoutSVGPath path",
-          "rect": [0, 0, 334, 500],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt
index 3e8205b..89ba9da 100644
--- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-pattern-and-object-creation-expected.txt
@@ -10,26 +10,6 @@
           "object": "LayoutSVGContainer g id='content'",
           "rect": [0, 15, 684, 362],
           "reason": "became visible"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [16, 16, 18, 18],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [16, 16, 18, 18],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [8, 8, 17, 17],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [8, 8, 17, 17],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-pattern-creation-expected.txt b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-pattern-creation-expected.txt
index 84ae92a3..3148be8 100644
--- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-pattern-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/js-late-pattern-creation-expected.txt
@@ -10,16 +10,6 @@
           "object": "LayoutSVGText text",
           "rect": [33, 23, 624, 189],
           "reason": "style change"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [16, 25, 18, 25],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [8, 12, 17, 26],
-          "reason": "layoutObject insertion"
         }
       ]
     }
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/tabgroup-expected.txt b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/tabgroup-expected.txt
index fefc1414..8c3b8d3b 100644
--- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/tabgroup-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/tabgroup-expected.txt
@@ -57,6 +57,11 @@
           "reason": "became visible"
         },
         {
+          "object": "LayoutSVGRect rect",
+          "rect": [30, 188, 240, 12],
+          "reason": "layoutObject removal"
+        },
+        {
           "object": "LayoutSVGPath path",
           "rect": [506, 233, 238, 159],
           "reason": "layoutObject insertion"
@@ -108,32 +113,32 @@
         },
         {
           "object": "LayoutSVGRect rect",
-          "rect": [31, 404, 188, 10],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGRect rect",
-          "rect": [23, 146, 188, 10],
+          "rect": [39, 189, 222, 122],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGRect rect",
-          "rect": [30, 147, 175, 97],
+          "rect": [40, 188, 220, 122],
           "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [38, 405, 174, 96],
-          "reason": "layoutObject insertion"
+          "object": "LayoutSVGInlineText #text",
+          "rect": [10, 43, 191, 31],
+          "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [39, 404, 172, 96],
-          "reason": "layoutObject insertion"
+          "object": "LayoutSVGInlineText #text",
+          "rect": [10, 43, 191, 31],
+          "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGRect rect",
-          "rect": [31, 146, 172, 96],
+          "object": "LayoutSVGTSpan tspan",
+          "rect": [10, 43, 191, 31],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGText text",
+          "rect": [10, 43, 191, 31],
           "reason": "layoutObject removal"
         },
         {
@@ -162,31 +167,6 @@
           "reason": "became visible"
         },
         {
-          "object": "LayoutSVGText text",
-          "rect": [15, 291, 150, 25],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [7, 33, 150, 25],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [7, 33, 150, 25],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGTSpan tspan",
-          "rect": [7, 33, 150, 25],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGText text",
-          "rect": [7, 33, 150, 25],
-          "reason": "layoutObject removal"
-        },
-        {
           "object": "LayoutSVGPath path id='tabgroupTriangle__1'",
           "rect": [61, 256, 67, 31],
           "reason": "layoutObject insertion"
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/text-mask-update-expected.txt b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/text-mask-update-expected.txt
index b3da5b5..e376f1b 100644
--- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/text-mask-update-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/text-mask-update-expected.txt
@@ -12,21 +12,11 @@
           "reason": "style change"
         },
         {
-          "object": "LayoutSVGText text id='text1'",
-          "rect": [10, 2, 46, 22],
-          "reason": "style change"
-        },
-        {
           "object": "LayoutSVGInlineText #text",
           "rect": [10, 32, 43, 22],
           "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGText text id='text2'",
-          "rect": [10, 32, 43, 22],
-          "reason": "full"
-        },
-        {
           "object": "LayoutSVGRect rect",
           "rect": [10, 32, 43, 18],
           "reason": "full"
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/use-detach-expected.txt b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/use-detach-expected.txt
index 63ad26c..f46373f 100644
--- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/use-detach-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/use-detach-expected.txt
@@ -24,31 +24,6 @@
         {
           "object": "LayoutSVGContainer use",
           "rect": [210, 58, 44, 37],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [210, 58, 44, 37],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [210, 58, 44, 37],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [210, 58, 44, 37],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [210, 58, 44, 37],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGInlineText #text",
-          "rect": [210, 58, 44, 37],
           "reason": "layoutObject removal"
         },
         {
@@ -62,73 +37,83 @@
           "reason": "layoutObject removal"
         },
         {
-          "object": "LayoutSVGText text id='use_text'",
-          "rect": [210, 58, 44, 37],
+          "object": "LayoutSVGContainer use",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGEllipse circle id='use_circle'",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGEllipse circle id='use_circle'",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutSVGEllipse circle id='use_circle'",
+          "rect": [218, 94, 28, 28],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [41, 19, 18, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [41, 19, 18, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGInlineText #text",
+          "rect": [41, 19, 18, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGInlineText #text",
+          "rect": [41, 19, 18, 16],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGText text id='use_text'",
-          "rect": [210, 58, 44, 37],
+          "rect": [41, 19, 18, 16],
+          "reason": "layoutObject removal"
+        },
+        {
+          "object": "LayoutSVGText text id='use_text'",
+          "rect": [41, 19, 18, 16],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGContainer use",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject insertion"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         },
         {
           "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
-          "reason": "layoutObject removal"
-        },
-        {
-          "object": "LayoutSVGEllipse circle id='use_circle'",
-          "rect": [218, 94, 28, 28],
+          "rect": [44, 34, 12, 12],
           "reason": "layoutObject removal"
         }
       ]
diff --git a/third_party/WebKit/LayoutTests/virtual/disable-spinvalidation/paint/invalidation/svg/marker-child-changes-css-expected.txt b/third_party/WebKit/LayoutTests/virtual/disable-spinvalidation/paint/invalidation/svg/marker-child-changes-css-expected.txt
new file mode 100644
index 0000000..717a6b2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/disable-spinvalidation/paint/invalidation/svg/marker-child-changes-css-expected.txt
@@ -0,0 +1,33 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "paintInvalidations": [
+        {
+          "object": "LayoutSVGPath path",
+          "rect": [121, 126, 68, 68],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutSVGRect rect id='rect'",
+          "rect": [0, 0, 2, 2],
+          "reason": "style change"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "LayoutSVGRect rect id='rect'",
+      "reason": "style change"
+    },
+    {
+      "object": "LayoutSVGPath path",
+      "reason": "style change"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/virtual/disable-spinvalidation/paint/invalidation/svg/marker-child-changes-expected.txt b/third_party/WebKit/LayoutTests/virtual/disable-spinvalidation/paint/invalidation/svg/marker-child-changes-expected.txt
new file mode 100644
index 0000000..717a6b2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/disable-spinvalidation/paint/invalidation/svg/marker-child-changes-expected.txt
@@ -0,0 +1,33 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "paintInvalidations": [
+        {
+          "object": "LayoutSVGPath path",
+          "rect": [121, 126, 68, 68],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutSVGRect rect id='rect'",
+          "rect": [0, 0, 2, 2],
+          "reason": "style change"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "LayoutSVGRect rect id='rect'",
+      "reason": "style change"
+    },
+    {
+      "object": "LayoutSVGPath path",
+      "reason": "style change"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/virtual/disable-spinvalidation/paint/invalidation/svg/marker-viewBox-changes-expected.txt b/third_party/WebKit/LayoutTests/virtual/disable-spinvalidation/paint/invalidation/svg/marker-viewBox-changes-expected.txt
new file mode 100644
index 0000000..60536ef
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/disable-spinvalidation/paint/invalidation/svg/marker-viewBox-changes-expected.txt
@@ -0,0 +1,46 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "paintInvalidations": [
+        {
+          "object": "LayoutSVGPath path id='go'",
+          "rect": [89, 94, 100, 100],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutSVGContainer g",
+          "rect": [90, 95, 98, 98],
+          "reason": "bounds change"
+        },
+        {
+          "object": "LayoutSVGRect rect",
+          "rect": [0, 0, 10, 10],
+          "reason": "bounds change"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "LayoutSVGResourceMarker marker id='markerStart'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutSVGRect rect",
+      "reason": "bounds change"
+    },
+    {
+      "object": "LayoutSVGContainer g",
+      "reason": "bounds change"
+    },
+    {
+      "object": "LayoutSVGPath path id='go'",
+      "reason": "full"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/Source/BUILD.gn b/third_party/WebKit/Source/BUILD.gn
index b296b0e..25832dea 100644
--- a/third_party/WebKit/Source/BUILD.gn
+++ b/third_party/WebKit/Source/BUILD.gn
@@ -158,15 +158,6 @@
         "use-chromium-style-naming",
       ]
     }
-
-    # TODO(https://crbug.com/689864): remove once the GC plugin has been rolled
-    # with this warning default enabled.
-    cflags += [
-      "-Xclang",
-      "-plugin-arg-blink-gc-plugin",
-      "-Xclang",
-      "warn-stack-allocated-trace-method",
-    ]
   }
 }
 
diff --git a/third_party/WebKit/Source/bindings/core/v8/BUILD.gn b/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
index cd9dba2..d32e23a 100644
--- a/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
+++ b/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
@@ -27,14 +27,6 @@
   "$blink_core_output_dir/css/PropertyDescriptor.h",
   "$blink_core_output_dir/css/cssom/CSSCalcDictionary.cpp",
   "$blink_core_output_dir/css/cssom/CSSCalcDictionary.h",
-  "$blink_core_output_dir/dom/DOMMatrixInit.cpp",
-  "$blink_core_output_dir/dom/DOMMatrixInit.h",
-  "$blink_core_output_dir/dom/DOMPointInit.cpp",
-  "$blink_core_output_dir/dom/DOMPointInit.h",
-  "$blink_core_output_dir/dom/DOMQuadInit.cpp",
-  "$blink_core_output_dir/dom/DOMQuadInit.h",
-  "$blink_core_output_dir/dom/DOMRectInit.cpp",
-  "$blink_core_output_dir/dom/DOMRectInit.h",
   "$blink_core_output_dir/dom/ElementCreationOptions.cpp",
   "$blink_core_output_dir/dom/ElementCreationOptions.h",
   "$blink_core_output_dir/dom/ElementDefinitionOptions.cpp",
@@ -119,6 +111,14 @@
   "$blink_core_output_dir/frame/ScrollOptions.h",
   "$blink_core_output_dir/frame/ScrollToOptions.cpp",
   "$blink_core_output_dir/frame/ScrollToOptions.h",
+  "$blink_core_output_dir/geometry/DOMMatrixInit.cpp",
+  "$blink_core_output_dir/geometry/DOMMatrixInit.h",
+  "$blink_core_output_dir/geometry/DOMPointInit.cpp",
+  "$blink_core_output_dir/geometry/DOMPointInit.h",
+  "$blink_core_output_dir/geometry/DOMQuadInit.cpp",
+  "$blink_core_output_dir/geometry/DOMQuadInit.h",
+  "$blink_core_output_dir/geometry/DOMRectInit.cpp",
+  "$blink_core_output_dir/geometry/DOMRectInit.h",
   "$blink_core_output_dir/html/AssignedNodesOptions.cpp",
   "$blink_core_output_dir/html/AssignedNodesOptions.h",
   "$blink_core_output_dir/html/ImageDataColorSettings.cpp",
diff --git a/third_party/WebKit/Source/bindings/core/v8/ExceptionStatePlaceholder.cpp b/third_party/WebKit/Source/bindings/core/v8/ExceptionStatePlaceholder.cpp
deleted file mode 100644
index 709ebf73..0000000
--- a/third_party/WebKit/Source/bindings/core/v8/ExceptionStatePlaceholder.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bindings/core/v8/ExceptionState.h"
-
-namespace blink {
-
-#if DCHECK_IS_ON()
-
-NoExceptionStateAssertionChecker::NoExceptionStateAssertionChecker(
-    const char* file,
-    int line)
-    : ExceptionState(nullptr, ExceptionState::UnknownContext, nullptr, nullptr),
-      m_file(file),
-      m_line(line) {}
-
-void NoExceptionStateAssertionChecker::throwDOMException(ExceptionCode,
-                                                         const String&) {
-  DCHECK_AT(false, m_file, m_line) << "DOMExeption should not be thrown.";
-}
-
-void NoExceptionStateAssertionChecker::throwRangeError(const String& message) {
-  DCHECK_AT(false, m_file, m_line) << "RangeError should not be thrown.";
-}
-
-void NoExceptionStateAssertionChecker::throwSecurityError(const String&,
-                                                          const String&) {
-  DCHECK_AT(false, m_file, m_line) << "SecurityError should not be thrown.";
-}
-
-void NoExceptionStateAssertionChecker::throwTypeError(const String&) {
-  DCHECK_AT(false, m_file, m_line) << "TypeError should not be thrown.";
-}
-
-void NoExceptionStateAssertionChecker::rethrowV8Exception(
-    v8::Local<v8::Value>) {
-  DCHECK_AT(false, m_file, m_line) << "An exception should not be rethrown.";
-}
-
-#endif
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index d6d3ba4..53be3ac 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -152,6 +152,7 @@
   # If you create a new subdirectory, make a new BUILD file for that directory
   # and reference it in the deps below rather than adding the sources here.
   sources = [
+    "CoreExport.h",
     "CoreInitializer.cpp",
     "CoreInitializer.h",
   ]
@@ -176,6 +177,7 @@
     "//third_party/WebKit/Source/core/events",
     "//third_party/WebKit/Source/core/fileapi",
     "//third_party/WebKit/Source/core/frame",
+    "//third_party/WebKit/Source/core/geometry",
     "//third_party/WebKit/Source/core/html",
     "//third_party/WebKit/Source/core/imagebitmap",
     "//third_party/WebKit/Source/core/input",
@@ -1161,7 +1163,6 @@
     "dom/AttrTest.cpp",
     "dom/CSSSelectorWatchTest.cpp",
     "dom/DOMImplementationTest.cpp",
-    "dom/DOMMatrixTest.cpp",
     "dom/DocumentStatisticsCollectorTest.cpp",
     "dom/DocumentTest.cpp",
     "dom/DocumentUserGestureTokenTest.cpp",
@@ -1220,6 +1221,7 @@
     "frame/csp/ContentSecurityPolicyTest.cpp",
     "frame/csp/MediaListDirectiveTest.cpp",
     "frame/csp/SourceListDirectiveTest.cpp",
+    "geometry/DOMMatrixTest.cpp",
     "html/AutoplayUmaHelperTest.cpp",
     "html/FormDataTest.cpp",
     "html/HTMLDimensionTest.cpp",
@@ -1319,6 +1321,7 @@
     "layout/ng/ng_min_max_content_size_test.cc",
     "layout/ng/ng_out_of_flow_layout_part_test.cc",
     "layout/ng/ng_relative_utils_test.cc",
+    "layout/ng/ng_space_utils_test.cc",
     "layout/ng/ng_text_layout_algorithm_test.cc",
     "layout/shapes/BoxShapeTest.cpp",
     "layout/svg/LayoutSVGRootTest.cpp",
@@ -1379,6 +1382,7 @@
     "style/FilterOperationsTest.cpp",
     "style/OutlineValueTest.cpp",
     "style/SVGComputedStyleTest.cpp",
+    "style/StyleDifferenceTest.cpp",
     "svg/SVGPathParserTest.cpp",
     "svg/UnsafeSVGAttributeSanitizationTest.cpp",
     "svg/graphics/SVGImageTest.cpp",
diff --git a/third_party/WebKit/Source/core/animation/BUILD.gn b/third_party/WebKit/Source/core/animation/BUILD.gn
index adb1cc2..2decca8e 100644
--- a/third_party/WebKit/Source/core/animation/BUILD.gn
+++ b/third_party/WebKit/Source/core/animation/BUILD.gn
@@ -24,6 +24,7 @@
     "AnimationTimeline.h",
     "BasicShapeInterpolationFunctions.cpp",
     "BasicShapeInterpolationFunctions.h",
+    "BasicShapePropertyFunctions.h",
     "BorderImageLengthBoxPropertyFunctions.h",
     "CSSAngleInterpolationType.cpp",
     "CSSAngleInterpolationType.h",
@@ -120,6 +121,7 @@
     "InertEffect.h",
     "InterpolableValue.cpp",
     "InterpolableValue.h",
+    "InterpolatedSVGPathSource.h",
     "Interpolation.h",
     "InterpolationEffect.cpp",
     "InterpolationEffect.h",
@@ -196,6 +198,7 @@
     "SampledEffect.h",
     "ShadowInterpolationFunctions.cpp",
     "ShadowInterpolationFunctions.h",
+    "ShadowListPropertyFunctions.h",
     "SizeInterpolationFunctions.cpp",
     "SizeInterpolationFunctions.h",
     "SizeListPropertyFunctions.cpp",
@@ -212,6 +215,7 @@
     "TransitionKeyframe.cpp",
     "TransitionKeyframe.h",
     "TypedInterpolationValue.h",
+    "UnderlyingLengthChecker.h",
     "UnderlyingValueOwner.cpp",
     "UnderlyingValueOwner.h",
     "animatable/AnimatableClipPathOperation.cpp",
diff --git a/third_party/WebKit/Source/core/clipboard/BUILD.gn b/third_party/WebKit/Source/core/clipboard/BUILD.gn
index e183e82..7c3af33d 100644
--- a/third_party/WebKit/Source/core/clipboard/BUILD.gn
+++ b/third_party/WebKit/Source/core/clipboard/BUILD.gn
@@ -12,6 +12,7 @@
     "DataObjectItem.h",
     "DataTransfer.cpp",
     "DataTransfer.h",
+    "DataTransferAccessPolicy.h",
     "DataTransferItem.cpp",
     "DataTransferItem.h",
     "DataTransferItemList.cpp",
diff --git a/third_party/WebKit/Source/core/core_idl_files.gni b/third_party/WebKit/Source/core/core_idl_files.gni
index cf04f09..5d9a8300 100644
--- a/third_party/WebKit/Source/core/core_idl_files.gni
+++ b/third_party/WebKit/Source/core/core_idl_files.gni
@@ -98,13 +98,13 @@
                                  "dom/CompositorProxy.idl",
                                  "dom/DOMException.idl",
                                  "dom/DOMImplementation.idl",
-                                 "dom/DOMMatrix.idl",
-                                 "dom/DOMMatrixReadOnly.idl",
-                                 "dom/DOMPoint.idl",
-                                 "dom/DOMPointReadOnly.idl",
-                                 "dom/DOMQuad.idl",
-                                 "dom/DOMRect.idl",
-                                 "dom/DOMRectReadOnly.idl",
+                                 "geometry/DOMMatrix.idl",
+                                 "geometry/DOMMatrixReadOnly.idl",
+                                 "geometry/DOMPoint.idl",
+                                 "geometry/DOMPointReadOnly.idl",
+                                 "geometry/DOMQuad.idl",
+                                 "geometry/DOMRect.idl",
+                                 "geometry/DOMRectReadOnly.idl",
                                  "dom/DOMStringList.idl",
                                  "dom/DOMStringMap.idl",
                                  "dom/DOMTokenList.idl",
@@ -515,10 +515,10 @@
                     "css/MediaQueryListEventInit.idl",
                     "css/PropertyDescriptor.idl",
                     "css/cssom/CSSCalcDictionary.idl",
-                    "dom/DOMMatrixInit.idl",
-                    "dom/DOMPointInit.idl",
-                    "dom/DOMQuadInit.idl",
-                    "dom/DOMRectInit.idl",
+                    "geometry/DOMMatrixInit.idl",
+                    "geometry/DOMPointInit.idl",
+                    "geometry/DOMQuadInit.idl",
+                    "geometry/DOMRectInit.idl",
                     "dom/ElementCreationOptions.idl",
                     "dom/ElementDefinitionOptions.idl",
                     "dom/ElementRegistrationOptions.idl",
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn
index cbb07da..ed9389d 100644
--- a/third_party/WebKit/Source/core/css/BUILD.gn
+++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -73,6 +73,7 @@
     "CSSGridTemplateAreasValue.h",
     "CSSGroupingRule.cpp",
     "CSSGroupingRule.h",
+    "CSSHelper.h",
     "CSSIdentifierValue.cpp",
     "CSSIdentifierValue.h",
     "CSSImageGeneratorValue.cpp",
@@ -116,12 +117,14 @@
     "CSSProperty.h",
     "CSSPropertyEquality.cpp",
     "CSSPropertyEquality.h",
+    "CSSPropertyIDTemplates.h",
     "CSSPropertySourceData.cpp",
     "CSSPropertySourceData.h",
     "CSSQuadValue.cpp",
     "CSSQuadValue.h",
     "CSSReflectValue.cpp",
     "CSSReflectValue.h",
+    "CSSReflectionDirection.h",
     "CSSRule.cpp",
     "CSSRule.h",
     "CSSRuleList.cpp",
@@ -338,9 +341,11 @@
     "parser/CSSParserContext.h",
     "parser/CSSParserFastPaths.cpp",
     "parser/CSSParserFastPaths.h",
+    "parser/CSSParserIdioms.h",
     "parser/CSSParserImpl.cpp",
     "parser/CSSParserImpl.h",
     "parser/CSSParserMode.h",
+    "parser/CSSParserObserver.h",
     "parser/CSSParserObserverWrapper.cpp",
     "parser/CSSParserObserverWrapper.h",
     "parser/CSSParserSelector.cpp",
@@ -492,10 +497,12 @@
     "properties/CSSPropertyLengthUtils.h",
     "properties/CSSPropertyMarginUtils.cpp",
     "properties/CSSPropertyMarginUtils.h",
+    "properties/CSSPropertyPositionUtils.h",
     "properties/CSSPropertyShapeUtils.cpp",
     "properties/CSSPropertyShapeUtils.h",
     "resolver/AnimatedStyleBuilder.cpp",
     "resolver/AnimatedStyleBuilder.h",
+    "resolver/CSSPropertyPriority.h",
     "resolver/CSSToStyleMap.cpp",
     "resolver/CSSToStyleMap.h",
     "resolver/CSSVariableResolver.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
index f321bb24..ea3d365 100644
--- a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
+++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
@@ -859,140 +859,6 @@
 }
 
 template <>
-inline CSSIdentifierValue::CSSIdentifierValue(EDisplay e)
-    : CSSValue(IdentifierClass) {
-  switch (e) {
-    case EDisplay::kInline:
-      m_valueID = CSSValueInline;
-      break;
-    case EDisplay::kBlock:
-      m_valueID = CSSValueBlock;
-      break;
-    case EDisplay::kListItem:
-      m_valueID = CSSValueListItem;
-      break;
-    case EDisplay::kInlineBlock:
-      m_valueID = CSSValueInlineBlock;
-      break;
-    case EDisplay::kTable:
-      m_valueID = CSSValueTable;
-      break;
-    case EDisplay::kInlineTable:
-      m_valueID = CSSValueInlineTable;
-      break;
-    case EDisplay::kTableRowGroup:
-      m_valueID = CSSValueTableRowGroup;
-      break;
-    case EDisplay::kTableHeaderGroup:
-      m_valueID = CSSValueTableHeaderGroup;
-      break;
-    case EDisplay::kTableFooterGroup:
-      m_valueID = CSSValueTableFooterGroup;
-      break;
-    case EDisplay::kTableRow:
-      m_valueID = CSSValueTableRow;
-      break;
-    case EDisplay::kTableColumnGroup:
-      m_valueID = CSSValueTableColumnGroup;
-      break;
-    case EDisplay::kTableColumn:
-      m_valueID = CSSValueTableColumn;
-      break;
-    case EDisplay::kTableCell:
-      m_valueID = CSSValueTableCell;
-      break;
-    case EDisplay::kTableCaption:
-      m_valueID = CSSValueTableCaption;
-      break;
-    case EDisplay::kWebkitBox:
-      m_valueID = CSSValueWebkitBox;
-      break;
-    case EDisplay::kWebkitInlineBox:
-      m_valueID = CSSValueWebkitInlineBox;
-      break;
-    case EDisplay::kFlex:
-      m_valueID = CSSValueFlex;
-      break;
-    case EDisplay::kInlineFlex:
-      m_valueID = CSSValueInlineFlex;
-      break;
-    case EDisplay::kGrid:
-      m_valueID = CSSValueGrid;
-      break;
-    case EDisplay::kInlineGrid:
-      m_valueID = CSSValueInlineGrid;
-      break;
-    case EDisplay::kContents:
-      m_valueID = CSSValueContents;
-      break;
-    case EDisplay::kFlowRoot:
-      m_valueID = CSSValueFlowRoot;
-      break;
-    case EDisplay::kNone:
-      m_valueID = CSSValueNone;
-      break;
-  }
-}
-
-template <>
-inline EDisplay CSSIdentifierValue::convertTo() const {
-  switch (m_valueID) {
-    case CSSValueInline:
-      return EDisplay::kInline;
-    case CSSValueBlock:
-      return EDisplay::kBlock;
-    case CSSValueListItem:
-      return EDisplay::kListItem;
-    case CSSValueInlineBlock:
-      return EDisplay::kInlineBlock;
-    case CSSValueTable:
-      return EDisplay::kTable;
-    case CSSValueInlineTable:
-      return EDisplay::kInlineTable;
-    case CSSValueTableRowGroup:
-      return EDisplay::kTableRowGroup;
-    case CSSValueTableHeaderGroup:
-      return EDisplay::kTableHeaderGroup;
-    case CSSValueTableFooterGroup:
-      return EDisplay::kTableFooterGroup;
-    case CSSValueTableRow:
-      return EDisplay::kTableRow;
-    case CSSValueTableColumnGroup:
-      return EDisplay::kTableColumnGroup;
-    case CSSValueTableColumn:
-      return EDisplay::kTableColumn;
-    case CSSValueTableCell:
-      return EDisplay::kTableCell;
-    case CSSValueTableCaption:
-      return EDisplay::kTableCaption;
-    case CSSValueWebkitBox:
-      return EDisplay::kWebkitBox;
-    case CSSValueWebkitInlineBox:
-      return EDisplay::kWebkitInlineBox;
-    case CSSValueFlex:
-    case CSSValueWebkitFlex:
-      return EDisplay::kFlex;
-    case CSSValueInlineFlex:
-    case CSSValueWebkitInlineFlex:
-      return EDisplay::kInlineFlex;
-    case CSSValueGrid:
-      return EDisplay::kGrid;
-    case CSSValueInlineGrid:
-      return EDisplay::kInlineGrid;
-    case CSSValueContents:
-      return EDisplay::kContents;
-    case CSSValueFlowRoot:
-      return EDisplay::kFlowRoot;
-    case CSSValueNone:
-      return EDisplay::kNone;
-      break;
-    default:
-      NOTREACHED();
-      return EDisplay::kNone;
-  }
-}
-
-template <>
 inline CSSIdentifierValue::CSSIdentifierValue(EFlexDirection e)
     : CSSValue(IdentifierClass) {
   switch (e) {
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5
index 4051222..96bfa49 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.json5
+++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -954,7 +954,16 @@
       interpolable: true,
       svg: true,
     },
-    "display",
+    {
+      name: "display",
+      initial_keyword: "inline",
+      field_template: 'keyword',
+      keywords: [
+        "inline", "block", "list-item", "inline-block", "table", "inline-table", "table-row-group", "table-header-group",
+        "table-footer-group", "table-row", "table-column-group", "table-column", "table-cell", "table-caption", "-webkit-box",
+        "-webkit-inline-box", "flex", "inline-flex", "grid", "inline-grid", "contents", "flow-root", "none",
+      ],
+    },
     {
       name: "dominant-baseline",
       inherited: true,
diff --git a/third_party/WebKit/Source/core/css/CSSValueIDMappings.h b/third_party/WebKit/Source/core/css/CSSValueIDMappings.h
index 97b5739..9ddee5f 100644
--- a/third_party/WebKit/Source/core/css/CSSValueIDMappings.h
+++ b/third_party/WebKit/Source/core/css/CSSValueIDMappings.h
@@ -74,6 +74,15 @@
   return detail::cssValueIDToPlatformEnumGenerated<ECursor>(v);
 }
 
+template <>
+inline EDisplay cssValueIDToPlatformEnum(CSSValueID v) {
+  if (v == CSSValueWebkitFlex)
+    return EDisplay::kFlex;
+  if (v == CSSValueWebkitInlineFlex)
+    return EDisplay::kInlineFlex;
+  return detail::cssValueIDToPlatformEnumGenerated<EDisplay>(v);
+}
+
 }  // namespace blink
 
 #endif
diff --git a/third_party/WebKit/Source/core/dom/AttrTest.cpp b/third_party/WebKit/Source/core/dom/AttrTest.cpp
index 03b115a..e658e2d 100644
--- a/third_party/WebKit/Source/core/dom/AttrTest.cpp
+++ b/third_party/WebKit/Source/core/dom/AttrTest.cpp
@@ -62,11 +62,4 @@
   EXPECT_EQ(value(), attr->textContent());
 }
 
-TEST_F(AttrTest, LengthOfContents) {
-  Attr* attr = createAttribute();
-  EXPECT_EQ(0u, attr->lengthOfContents());
-  attr->setValue(value());
-  EXPECT_EQ(0u, attr->lengthOfContents());
-}
-
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn
index 04c77b67..75fe9a8 100644
--- a/third_party/WebKit/Source/core/dom/BUILD.gn
+++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -59,30 +59,18 @@
     "DOMDataView.h",
     "DOMException.cpp",
     "DOMException.h",
+    "DOMHighResTimeStamp.h",
     "DOMImplementation.cpp",
     "DOMImplementation.h",
-    "DOMMatrix.cpp",
-    "DOMMatrix.h",
-    "DOMMatrixReadOnly.cpp",
-    "DOMMatrixReadOnly.h",
     "DOMNodeIds.cpp",
     "DOMNodeIds.h",
-    "DOMPoint.cpp",
-    "DOMPoint.h",
-    "DOMPointReadOnly.cpp",
-    "DOMPointReadOnly.h",
-    "DOMQuad.cpp",
-    "DOMQuad.h",
-    "DOMRect.cpp",
-    "DOMRect.h",
-    "DOMRectReadOnly.cpp",
-    "DOMRectReadOnly.h",
     "DOMSharedArrayBuffer.cpp",
     "DOMSharedArrayBuffer.h",
     "DOMStringList.cpp",
     "DOMStringList.h",
     "DOMStringMap.cpp",
     "DOMStringMap.h",
+    "DOMTimeStamp.h",
     "DOMTokenList.cpp",
     "DOMTokenList.h",
     "DOMTypedArray.cpp",
@@ -115,6 +103,7 @@
     "DocumentOrderedMap.h",
     "DocumentParser.cpp",
     "DocumentParser.h",
+    "DocumentParserClient.h",
     "DocumentParserTiming.cpp",
     "DocumentParserTiming.h",
     "DocumentStatisticsCollector.cpp",
@@ -127,6 +116,7 @@
     "DocumentTiming.h",
     "DocumentType.cpp",
     "DocumentType.h",
+    "DocumentUserGestureToken.h",
     "Element.cpp",
     "Element.h",
     "ElementData.cpp",
@@ -230,6 +220,7 @@
     "NthIndexCache.cpp",
     "NthIndexCache.h",
     "ParentNode.h",
+    "ParserContentPolicy.h",
     "PendingScript.cpp",
     "PendingScript.h",
     "PresentationAttributeStyle.cpp",
@@ -241,6 +232,7 @@
     "QualifiedName.cpp",
     "QualifiedName.h",
     "Range.cpp",
+    "RangeBoundaryPoint.h",
     "RawDataDocumentParser.h",
     "RemoteSecurityContext.cpp",
     "RemoteSecurityContext.h",
@@ -306,6 +298,7 @@
     "TagCollection.h",
     "TaskRunnerHelper.cpp",
     "TaskRunnerHelper.h",
+    "TemplateContentDocumentFragment.h",
     "Text.cpp",
     "TextLinkColors.cpp",
     "TextLinkColors.h",
@@ -324,6 +317,7 @@
     "TreeScopeStyleSheetCollection.h",
     "TreeWalker.cpp",
     "TreeWalker.h",
+    "TypedFlexibleArrayBufferView.h",
     "URLSearchParams.cpp",
     "URLSearchParams.h",
     "UserActionElementSet.cpp",
diff --git a/third_party/WebKit/Source/core/dom/CompositorProxy.h b/third_party/WebKit/Source/core/dom/CompositorProxy.h
index 37efc84..e14980e 100644
--- a/third_party/WebKit/Source/core/dom/CompositorProxy.h
+++ b/third_party/WebKit/Source/core/dom/CompositorProxy.h
@@ -8,8 +8,8 @@
 #include "bindings/core/v8/ScriptWrappable.h"
 #include "core/CoreExport.h"
 #include "core/dom/CompositorProxyClient.h"
-#include "core/dom/DOMMatrix.h"
 #include "core/dom/Element.h"
+#include "core/geometry/DOMMatrix.h"
 #include "platform/graphics/CompositorMutableState.h"
 #include "platform/heap/Handle.h"
 #include "wtf/text/WTFString.h"
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 218fbb4..faada473 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -3078,6 +3078,8 @@
     return;
 
   if (m_loadEventProgress <= UnloadEventInProgress) {
+    if (page())
+      page()->willUnloadDocument(*this);
     Element* currentFocusedElement = focusedElement();
     if (isHTMLInputElement(currentFocusedElement))
       toHTMLInputElement(*currentFocusedElement).endEditing();
@@ -3305,6 +3307,13 @@
   MainThreadDebugger::instance()->exceptionThrown(this, event);
 }
 
+KURL Document::urlForBinding() {
+  if (!url().isNull()) {
+    return url();
+  }
+  return blankURL();
+}
+
 void Document::setURL(const KURL& url) {
   const KURL& newURL = url.isEmpty() ? blankURL() : url;
   if (newURL == m_url)
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h
index 83ac390..a96d14e 100644
--- a/third_party/WebKit/Source/core/dom/Document.h
+++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -593,9 +593,14 @@
 
   bool wellFormed() const { return m_wellFormed; }
 
+  // Return the document URL, or an empty URL if it's unavailable.
+  // This is not an implementation of web-exposed Document.prototype.URL.
   const KURL& url() const { return m_url; }
   void setURL(const KURL&);
 
+  // Bind the url to document.url, if unavailable bind to about:blank.
+  KURL urlForBinding();
+
   // To understand how these concepts relate to one another, please see the
   // comments surrounding their declaration.
   const KURL& baseURL() const { return m_baseURL; }
diff --git a/third_party/WebKit/Source/core/dom/Document.idl b/third_party/WebKit/Source/core/dom/Document.idl
index 68a3907..575e640 100644
--- a/third_party/WebKit/Source/core/dom/Document.idl
+++ b/third_party/WebKit/Source/core/dom/Document.idl
@@ -37,9 +37,9 @@
 // FIXME: Document should have a constructor. crbug.com/238234
 interface Document : Node {
     [SameObject] readonly attribute DOMImplementation implementation;
-    readonly attribute DOMString URL;
+    [ImplementedAs=urlForBinding] readonly attribute DOMString URL;
     // FIXME: documentURI should not be nullable.
-    [ImplementedAs=url] readonly attribute DOMString? documentURI;
+    [ImplementedAs=urlForBinding] readonly attribute DOMString? documentURI;
     [MeasureAs=DocumentOrigin] readonly attribute DOMString origin;
     [RuntimeEnabled=suborigins] readonly attribute DOMString suborigin;
     readonly attribute DOMString compatMode;
diff --git a/third_party/WebKit/Source/core/dom/DocumentTest.cpp b/third_party/WebKit/Source/core/dom/DocumentTest.cpp
index d16f310..9f2fb28 100644
--- a/third_party/WebKit/Source/core/dom/DocumentTest.cpp
+++ b/third_party/WebKit/Source/core/dom/DocumentTest.cpp
@@ -36,8 +36,12 @@
 #include "core/dom/SynchronousMutationObserver.h"
 #include "core/dom/Text.h"
 #include "core/frame/FrameView.h"
+#include "core/frame/Settings.h"
 #include "core/html/HTMLHeadElement.h"
+#include "core/html/HTMLInputElement.h"
 #include "core/html/HTMLLinkElement.h"
+#include "core/page/Page.h"
+#include "core/page/ValidationMessageClient.h"
 #include "core/testing/DummyPageHolder.h"
 #include "platform/heap/Handle.h"
 #include "platform/weborigin/ReferrerPolicy.h"
@@ -242,6 +246,45 @@
   SynchronousMutationObserver::trace(visitor);
 }
 
+class MockValidationMessageClient
+    : public GarbageCollectedFinalized<MockValidationMessageClient>,
+      public ValidationMessageClient {
+  USING_GARBAGE_COLLECTED_MIXIN(MockValidationMessageClient);
+
+ public:
+  MockValidationMessageClient() { reset(); }
+  void reset() {
+    showValidationMessageWasCalled = false;
+    willUnloadDocumentWasCalled = false;
+    documentDetachedWasCalled = false;
+  }
+  bool showValidationMessageWasCalled;
+  bool willUnloadDocumentWasCalled;
+  bool documentDetachedWasCalled;
+
+  // ValidationMessageClient functions.
+  void showValidationMessage(const Element& anchor,
+                             const String& mainMessage,
+                             TextDirection,
+                             const String& subMessage,
+                             TextDirection) override {
+    showValidationMessageWasCalled = true;
+  }
+  void hideValidationMessage(const Element& anchor) override {}
+  bool isValidationMessageVisible(const Element& anchor) override {
+    return true;
+  }
+  void willUnloadDocument(const Document&) override {
+    willUnloadDocumentWasCalled = true;
+  }
+  void documentDetached(const Document&) override {
+    documentDetachedWasCalled = true;
+  }
+  void willBeDestroyed() override {}
+
+  // DEFINE_INLINE_VIRTUAL_TRACE() { ValidationMessageClient::trace(visitor); }
+};
+
 }  // anonymous namespace
 
 // This tests that we properly resize and re-layout pages for printing in the
@@ -652,4 +695,38 @@
   }
 }
 
+TEST_F(DocumentTest, ValidationMessageCleanup) {
+  ValidationMessageClient* originalClient = &page().validationMessageClient();
+  MockValidationMessageClient* mockClient = new MockValidationMessageClient();
+  document().settings()->setScriptEnabled(true);
+  page().setValidationMessageClient(mockClient);
+  // implicitOpen()-implicitClose() makes Document.loadEventFinished()
+  // true. It's necessary to kick unload process.
+  document().implicitOpen(ForceSynchronousParsing);
+  document().implicitClose();
+  document().appendChild(document().createElement("html"));
+  setHtmlInnerHTML("<body><input required></body>");
+  Element* script = document().createElement("script");
+  script->setTextContent(
+      "window.onunload = function() {"
+      "document.querySelector('input').reportValidity(); };");
+  document().body()->appendChild(script);
+  HTMLInputElement* input = toHTMLInputElement(document().body()->firstChild());
+  DVLOG(0) << document().body()->outerHTML();
+
+  // Sanity check.
+  input->reportValidity();
+  EXPECT_TRUE(mockClient->showValidationMessageWasCalled);
+  mockClient->reset();
+
+  // prepareForCommit() unloads the document, and shutdown.
+  document().frame()->prepareForCommit();
+  EXPECT_TRUE(mockClient->willUnloadDocumentWasCalled);
+  EXPECT_TRUE(mockClient->documentDetachedWasCalled);
+  // Unload handler tried to show a validation message, but it should fail.
+  EXPECT_FALSE(mockClient->showValidationMessageWasCalled);
+
+  page().setValidationMessageClient(originalClient);
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/Node.cpp b/third_party/WebKit/Source/core/dom/Node.cpp
index 9e1e08e..9bc67dec 100644
--- a/third_party/WebKit/Source/core/dom/Node.cpp
+++ b/third_party/WebKit/Source/core/dom/Node.cpp
@@ -2493,27 +2493,6 @@
   EventTarget::traceWrappers(visitor);
 }
 
-unsigned Node::lengthOfContents() const {
-  // This switch statement must be consistent with that of
-  // Range::processContentsBetweenOffsets.
-  switch (getNodeType()) {
-    case Node::kTextNode:
-    case Node::kCdataSectionNode:
-    case Node::kCommentNode:
-    case Node::kProcessingInstructionNode:
-      return toCharacterData(this)->length();
-    case Node::kElementNode:
-    case Node::kDocumentNode:
-    case Node::kDocumentFragmentNode:
-      return toContainerNode(this)->countChildren();
-    case Node::kAttributeNode:
-    case Node::kDocumentTypeNode:
-      return 0;
-  }
-  NOTREACHED();
-  return 0;
-}
-
 }  // namespace blink
 
 #ifndef NDEBUG
diff --git a/third_party/WebKit/Source/core/dom/Node.h b/third_party/WebKit/Source/core/dom/Node.h
index 26d31c6..e80329ba 100644
--- a/third_party/WebKit/Source/core/dom/Node.h
+++ b/third_party/WebKit/Source/core/dom/Node.h
@@ -772,8 +772,6 @@
 
   DECLARE_VIRTUAL_TRACE_WRAPPERS();
 
-  unsigned lengthOfContents() const;
-
  private:
   enum NodeFlags {
     HasRareDataFlag = 1,
@@ -884,13 +882,6 @@
 
   void setTreeScope(TreeScope* scope) { m_treeScope = scope; }
 
-  // isTreeScopeInitialized() can be false
-  // - in the destruction of Document or ShadowRoot where m_treeScope is set to
-  //   null or
-  // - in the Node constructor called by these two classes where m_treeScope is
-  //   set by TreeScope ctor.
-  bool isTreeScopeInitialized() const { return m_treeScope; }
-
   void markAncestorsWithChildNeedsStyleRecalc();
 
   void setIsFinishedParsingChildren(bool value) {
diff --git a/third_party/WebKit/Source/core/dom/Range.cpp b/third_party/WebKit/Source/core/dom/Range.cpp
index 938dfec..338d8ff 100644
--- a/third_party/WebKit/Source/core/dom/Range.cpp
+++ b/third_party/WebKit/Source/core/dom/Range.cpp
@@ -26,8 +26,10 @@
 #include "core/dom/Range.h"
 
 #include "bindings/core/v8/ExceptionState.h"
+#include "core/dom/CharacterData.h"
 #include "core/dom/ClientRect.h"
 #include "core/dom/ClientRectList.h"
+#include "core/dom/ContainerNode.h"
 #include "core/dom/DocumentFragment.h"
 #include "core/dom/ExceptionCode.h"
 #include "core/dom/Node.h"
@@ -528,6 +530,27 @@
   return container;
 }
 
+static unsigned lengthOfContents(const Node* node) {
+  // This switch statement must be consistent with that of
+  // Range::processContentsBetweenOffsets.
+  switch (node->getNodeType()) {
+    case Node::kTextNode:
+    case Node::kCdataSectionNode:
+    case Node::kCommentNode:
+    case Node::kProcessingInstructionNode:
+      return toCharacterData(node)->length();
+    case Node::kElementNode:
+    case Node::kDocumentNode:
+    case Node::kDocumentFragmentNode:
+      return toContainerNode(node)->countChildren();
+    case Node::kAttributeNode:
+    case Node::kDocumentTypeNode:
+      return 0;
+  }
+  NOTREACHED();
+  return 0;
+}
+
 DocumentFragment* Range::processContents(ActionType action,
                                          ExceptionState& exceptionState) {
   typedef HeapVector<Member<Node>> NodeVector;
@@ -587,7 +610,7 @@
       commonRoot->contains(originalStart.container())) {
     leftContents = processContentsBetweenOffsets(
         action, nullptr, originalStart.container(), originalStart.offset(),
-        originalStart.container()->lengthOfContents(), exceptionState);
+        lengthOfContents(originalStart.container()), exceptionState);
     leftContents = processAncestorsAndTheirSiblings(
         action, originalStart.container(), ProcessContentsForward, leftContents,
         commonRoot, exceptionState);
@@ -675,7 +698,7 @@
   DCHECK_LE(startOffset, endOffset);
 
   // This switch statement must be consistent with that of
-  // Node::lengthOfContents.
+  // lengthOfContents.
   Node* result = nullptr;
   switch (container->getNodeType()) {
     case Node::kTextNode:
diff --git a/third_party/WebKit/Source/core/editing/SelectionModifier.cpp b/third_party/WebKit/Source/core/editing/SelectionModifier.cpp
index bf2ba830..77e0ea5 100644
--- a/third_party/WebKit/Source/core/editing/SelectionModifier.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionModifier.cpp
@@ -147,28 +147,11 @@
     const VisiblePosition& originalPosition) {
   VisiblePosition positionAfterCurrentWord = nextWordPosition(originalPosition);
 
-  if (frame() &&
-      frame()->editor().behavior().shouldSkipSpaceWhenMovingRight()) {
-    // In order to skip spaces when moving right, we advance one
-    // word further and then move one word back. Given the
-    // semantics of previousWordPosition() this will put us at the
-    // beginning of the word following.
-    VisiblePosition positionAfterSpacingAndFollowingWord =
-        nextWordPosition(positionAfterCurrentWord);
-    if (positionAfterSpacingAndFollowingWord.isNotNull() &&
-        positionAfterSpacingAndFollowingWord.deepEquivalent() !=
-            positionAfterCurrentWord.deepEquivalent())
-      positionAfterCurrentWord =
-          previousWordPosition(positionAfterSpacingAndFollowingWord);
-
-    bool movingBackwardsMovedPositionToStartOfCurrentWord =
-        positionAfterCurrentWord.deepEquivalent() ==
-        previousWordPosition(nextWordPosition(originalPosition))
-            .deepEquivalent();
-    if (movingBackwardsMovedPositionToStartOfCurrentWord)
-      positionAfterCurrentWord = positionAfterSpacingAndFollowingWord;
-  }
-  return positionAfterCurrentWord;
+  if (!frame() ||
+      !frame()->editor().behavior().shouldSkipSpaceWhenMovingRight())
+    return positionAfterCurrentWord;
+  return createVisiblePosition(
+      skipWhitespace(positionAfterCurrentWord.deepEquivalent()));
 }
 
 static void adjustPositionForUserSelectAll(VisiblePosition& pos,
diff --git a/third_party/WebKit/Source/core/events/BUILD.gn b/third_party/WebKit/Source/core/events/BUILD.gn
index fb13fee..513b2e6 100644
--- a/third_party/WebKit/Source/core/events/BUILD.gn
+++ b/third_party/WebKit/Source/core/events/BUILD.gn
@@ -6,6 +6,7 @@
 
 blink_core_sources("events") {
   sources = [
+    "AddEventListenerOptionsDefaults.h",
     "AddEventListenerOptionsResolved.cpp",
     "AddEventListenerOptionsResolved.h",
     "AnimationEvent.cpp",
@@ -78,6 +79,7 @@
     "ProgressEvent.h",
     "PromiseRejectionEvent.cpp",
     "PromiseRejectionEvent.h",
+    "RegisteredEventListener.h",
     "RelatedEvent.cpp",
     "RelatedEvent.h",
     "ResourceProgressEvent.cpp",
@@ -88,6 +90,7 @@
     "SecurityPolicyViolationEvent.h",
     "TextEvent.cpp",
     "TextEvent.h",
+    "TextEventInputType.h",
     "TouchEvent.cpp",
     "TouchEvent.h",
     "TouchEventContext.cpp",
diff --git a/third_party/WebKit/Source/core/frame/BUILD.gn b/third_party/WebKit/Source/core/frame/BUILD.gn
index a7d98ef..2e49aeb 100644
--- a/third_party/WebKit/Source/core/frame/BUILD.gn
+++ b/third_party/WebKit/Source/core/frame/BUILD.gn
@@ -41,6 +41,7 @@
     "FrameOwner.h",
     "FrameSerializer.cpp",
     "FrameSerializer.h",
+    "FrameTypes.h",
     "FrameView.cpp",
     "FrameView.h",
     "FrameViewAutoSizeInfo.cpp",
@@ -57,6 +58,7 @@
     "LocalDOMWindow.h",
     "LocalFrame.cpp",
     "LocalFrame.h",
+    "LocalFrameClient.h",
     "Location.cpp",
     "Location.h",
     "Navigator.cpp",
@@ -104,6 +106,7 @@
     "UseCounter.h",
     "VisualViewport.cpp",
     "VisualViewport.h",
+    "csp/CSPDirective.h",
     "csp/CSPDirectiveList.cpp",
     "csp/CSPDirectiveList.h",
     "csp/CSPSource.cpp",
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp
index 6e8030f..91c82bd 100644
--- a/third_party/WebKit/Source/core/frame/FrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -1627,20 +1627,23 @@
   DCHECK(widthChanged || heightChanged);
   DCHECK(m_frame->page());
 
-  if (LayoutViewItem layoutView = this->layoutViewItem()) {
-    if (layoutView.usesCompositing())
-      layoutView.compositor()->frameViewDidChangeSize();
-  }
+  bool rootLayerScrollingEnabled =
+      RuntimeEnabledFeatures::rootLayerScrollingEnabled();
 
-  // Ensure the root scroller compositing layers update geometry in response to
-  // the URL bar resizing.
-  if (m_frame->isMainFrame())
-    m_frame->page()->globalRootScrollerController().mainFrameViewResized();
+  if (LayoutViewItem layoutView = this->layoutViewItem()) {
+    if (layoutView.usesCompositing()) {
+      if (rootLayerScrollingEnabled) {
+        layoutView.layer()->setNeedsCompositingInputsUpdate();
+        if (RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled())
+          setNeedsPaintPropertyUpdate();
+      } else {
+        layoutView.compositor()->frameViewDidChangeSize();
+      }
+    }
+  }
 
   showOverlayScrollbars();
 
-  bool rootLayerScrollingEnabled =
-      RuntimeEnabledFeatures::rootLayerScrollingEnabled();
   if (rootLayerScrollingEnabled) {
     // The background must be repainted when the FrameView is resized, even if
     // the initial containing block does not change (so we can't rely on layout
diff --git a/third_party/WebKit/Source/core/geometry/BUILD.gn b/third_party/WebKit/Source/core/geometry/BUILD.gn
new file mode 100644
index 0000000..83905d1
--- /dev/null
+++ b/third_party/WebKit/Source/core/geometry/BUILD.gn
@@ -0,0 +1,31 @@
+# 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.
+
+import("//third_party/WebKit/Source/core/core.gni")
+
+blink_core_sources("geometry") {
+  split_count = 5
+
+  sources = [
+    "DOMMatrix.cpp",
+    "DOMMatrix.h",
+    "DOMMatrixReadOnly.cpp",
+    "DOMMatrixReadOnly.h",
+    "DOMPoint.cpp",
+    "DOMPoint.h",
+    "DOMPointReadOnly.cpp",
+    "DOMPointReadOnly.h",
+    "DOMQuad.cpp",
+    "DOMQuad.h",
+    "DOMRect.cpp",
+    "DOMRect.h",
+    "DOMRectReadOnly.cpp",
+    "DOMRectReadOnly.h",
+  ]
+
+  configs += [
+    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
+    "//build/config/compiler:no_size_t_to_int_warning",
+  ]
+}
diff --git a/third_party/WebKit/Source/core/dom/DOMMatrix.cpp b/third_party/WebKit/Source/core/geometry/DOMMatrix.cpp
similarity index 99%
rename from third_party/WebKit/Source/core/dom/DOMMatrix.cpp
rename to third_party/WebKit/Source/core/geometry/DOMMatrix.cpp
index 59c6ae4..8af26a5 100644
--- a/third_party/WebKit/Source/core/dom/DOMMatrix.cpp
+++ b/third_party/WebKit/Source/core/geometry/DOMMatrix.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/dom/DOMMatrix.h"
+#include "core/geometry/DOMMatrix.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/dom/DOMMatrix.h b/third_party/WebKit/Source/core/geometry/DOMMatrix.h
similarity index 97%
rename from third_party/WebKit/Source/core/dom/DOMMatrix.h
rename to third_party/WebKit/Source/core/geometry/DOMMatrix.h
index b4ccb8c..9a80c28 100644
--- a/third_party/WebKit/Source/core/dom/DOMMatrix.h
+++ b/third_party/WebKit/Source/core/geometry/DOMMatrix.h
@@ -6,8 +6,8 @@
 #define DOMMatrix_h
 
 #include "bindings/core/v8/ExceptionState.h"
-#include "core/dom/DOMMatrixInit.h"
-#include "core/dom/DOMMatrixReadOnly.h"
+#include "core/geometry/DOMMatrixInit.h"
+#include "core/geometry/DOMMatrixReadOnly.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/dom/DOMMatrix.idl b/third_party/WebKit/Source/core/geometry/DOMMatrix.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMMatrix.idl
rename to third_party/WebKit/Source/core/geometry/DOMMatrix.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMMatrixInit.idl b/third_party/WebKit/Source/core/geometry/DOMMatrixInit.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMMatrixInit.idl
rename to third_party/WebKit/Source/core/geometry/DOMMatrixInit.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp b/third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.cpp
similarity index 98%
rename from third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp
rename to third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.cpp
index e4c1ed95..fbce2ad2 100644
--- a/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp
+++ b/third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/dom/DOMMatrixReadOnly.h"
+#include "core/geometry/DOMMatrixReadOnly.h"
 
 #include "bindings/core/v8/V8ObjectBuilder.h"
 #include "core/css/CSSIdentifierValue.h"
@@ -10,10 +10,10 @@
 #include "core/css/CSSValueList.h"
 #include "core/css/parser/CSSParser.h"
 #include "core/css/resolver/TransformBuilder.h"
-#include "core/dom/DOMMatrix.h"
-#include "core/dom/DOMMatrixInit.h"
-#include "core/dom/DOMPoint.h"
-#include "core/dom/DOMPointInit.h"
+#include "core/geometry/DOMMatrix.h"
+#include "core/geometry/DOMMatrixInit.h"
+#include "core/geometry/DOMPoint.h"
+#include "core/geometry/DOMPointInit.h"
 #include "core/layout/api/LayoutViewItem.h"
 #include "core/style/ComputedStyle.h"
 
diff --git a/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.h b/third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.h
similarity index 99%
rename from third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.h
rename to third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.h
index c78bfe5..71a8e13 100644
--- a/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.h
+++ b/third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.h
@@ -5,12 +5,12 @@
 #ifndef DOMMatrixReadOnly_h
 #define DOMMatrixReadOnly_h
 
+#include <memory>
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ScriptWrappable.h"
 #include "core/dom/DOMTypedArray.h"
 #include "platform/heap/Handle.h"
 #include "platform/transforms/TransformationMatrix.h"
-#include <memory>
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.idl b/third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.idl
rename to third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMMatrixTest.cpp b/third_party/WebKit/Source/core/geometry/DOMMatrixTest.cpp
similarity index 98%
rename from third_party/WebKit/Source/core/dom/DOMMatrixTest.cpp
rename to third_party/WebKit/Source/core/geometry/DOMMatrixTest.cpp
index 310701bc..c7119a82 100644
--- a/third_party/WebKit/Source/core/dom/DOMMatrixTest.cpp
+++ b/third_party/WebKit/Source/core/geometry/DOMMatrixTest.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/dom/DOMMatrix.h"
+#include "core/geometry/DOMMatrix.h"
 
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/V8BindingForTesting.h"
diff --git a/third_party/WebKit/Source/core/dom/DOMPoint.cpp b/third_party/WebKit/Source/core/geometry/DOMPoint.cpp
similarity index 87%
rename from third_party/WebKit/Source/core/dom/DOMPoint.cpp
rename to third_party/WebKit/Source/core/geometry/DOMPoint.cpp
index b3138485..ddbd90e 100644
--- a/third_party/WebKit/Source/core/dom/DOMPoint.cpp
+++ b/third_party/WebKit/Source/core/geometry/DOMPoint.cpp
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/dom/DOMPoint.h"
+#include "core/geometry/DOMPoint.h"
 
-#include "core/dom/DOMPointInit.h"
+#include "core/geometry/DOMPointInit.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/dom/DOMPoint.h b/third_party/WebKit/Source/core/geometry/DOMPoint.h
similarity index 94%
rename from third_party/WebKit/Source/core/dom/DOMPoint.h
rename to third_party/WebKit/Source/core/geometry/DOMPoint.h
index 95d5b2609..300213d 100644
--- a/third_party/WebKit/Source/core/dom/DOMPoint.h
+++ b/third_party/WebKit/Source/core/geometry/DOMPoint.h
@@ -6,7 +6,7 @@
 #define DOMPoint_h
 
 #include "core/CoreExport.h"
-#include "core/dom/DOMPointReadOnly.h"
+#include "core/geometry/DOMPointReadOnly.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/dom/DOMPoint.idl b/third_party/WebKit/Source/core/geometry/DOMPoint.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMPoint.idl
rename to third_party/WebKit/Source/core/geometry/DOMPoint.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMPointInit.idl b/third_party/WebKit/Source/core/geometry/DOMPointInit.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMPointInit.idl
rename to third_party/WebKit/Source/core/geometry/DOMPointInit.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMPointReadOnly.cpp b/third_party/WebKit/Source/core/geometry/DOMPointReadOnly.cpp
similarity index 88%
rename from third_party/WebKit/Source/core/dom/DOMPointReadOnly.cpp
rename to third_party/WebKit/Source/core/geometry/DOMPointReadOnly.cpp
index 538249e9..34a3cec4 100644
--- a/third_party/WebKit/Source/core/dom/DOMPointReadOnly.cpp
+++ b/third_party/WebKit/Source/core/geometry/DOMPointReadOnly.cpp
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/dom/DOMPointReadOnly.h"
+#include "core/geometry/DOMPointReadOnly.h"
 
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ScriptValue.h"
 #include "bindings/core/v8/V8ObjectBuilder.h"
-#include "core/dom/DOMMatrixInit.h"
-#include "core/dom/DOMMatrixReadOnly.h"
-#include "core/dom/DOMPoint.h"
-#include "core/dom/DOMPointInit.h"
+#include "core/geometry/DOMMatrixInit.h"
+#include "core/geometry/DOMMatrixReadOnly.h"
+#include "core/geometry/DOMPoint.h"
+#include "core/geometry/DOMPointInit.h"
 
 namespace blink {
 
@@ -21,8 +21,7 @@
   return new DOMPointReadOnly(x, y, z, w);
 }
 
-ScriptValue DOMPointReadOnly::toJSONForBinding(
-    ScriptState* scriptState) const {
+ScriptValue DOMPointReadOnly::toJSONForBinding(ScriptState* scriptState) const {
   V8ObjectBuilder result(scriptState);
   result.addNumber("x", x());
   result.addNumber("y", y());
diff --git a/third_party/WebKit/Source/core/dom/DOMPointReadOnly.h b/third_party/WebKit/Source/core/geometry/DOMPointReadOnly.h
similarity index 99%
rename from third_party/WebKit/Source/core/dom/DOMPointReadOnly.h
rename to third_party/WebKit/Source/core/geometry/DOMPointReadOnly.h
index 61d6176..f2e6936 100644
--- a/third_party/WebKit/Source/core/dom/DOMPointReadOnly.h
+++ b/third_party/WebKit/Source/core/geometry/DOMPointReadOnly.h
@@ -32,7 +32,7 @@
   double w() const { return m_w; }
 
   DEFINE_INLINE_TRACE() {}
-  
+
   ScriptValue toJSONForBinding(ScriptState*) const;
   DOMPoint* matrixTransform(DOMMatrixInit&, ExceptionState&);
 
diff --git a/third_party/WebKit/Source/core/dom/DOMPointReadOnly.idl b/third_party/WebKit/Source/core/geometry/DOMPointReadOnly.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMPointReadOnly.idl
rename to third_party/WebKit/Source/core/geometry/DOMPointReadOnly.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMQuad.cpp b/third_party/WebKit/Source/core/geometry/DOMQuad.cpp
similarity index 92%
rename from third_party/WebKit/Source/core/dom/DOMQuad.cpp
rename to third_party/WebKit/Source/core/geometry/DOMQuad.cpp
index 2bf2de0..f3acb8e 100644
--- a/third_party/WebKit/Source/core/dom/DOMQuad.cpp
+++ b/third_party/WebKit/Source/core/geometry/DOMQuad.cpp
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/dom/DOMQuad.h"
+#include "core/geometry/DOMQuad.h"
 
 #include "bindings/core/v8/V8ObjectBuilder.h"
-#include "core/dom/DOMPoint.h"
-#include "core/dom/DOMQuadInit.h"
-#include "core/dom/DOMRect.h"
-#include "core/dom/DOMRectInit.h"
+#include "core/geometry/DOMPoint.h"
+#include "core/geometry/DOMQuadInit.h"
+#include "core/geometry/DOMRect.h"
+#include "core/geometry/DOMRectInit.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/dom/DOMQuad.h b/third_party/WebKit/Source/core/geometry/DOMQuad.h
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMQuad.h
rename to third_party/WebKit/Source/core/geometry/DOMQuad.h
diff --git a/third_party/WebKit/Source/core/dom/DOMQuad.idl b/third_party/WebKit/Source/core/geometry/DOMQuad.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMQuad.idl
rename to third_party/WebKit/Source/core/geometry/DOMQuad.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMQuadInit.idl b/third_party/WebKit/Source/core/geometry/DOMQuadInit.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMQuadInit.idl
rename to third_party/WebKit/Source/core/geometry/DOMQuadInit.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMRect.cpp b/third_party/WebKit/Source/core/geometry/DOMRect.cpp
similarity index 88%
rename from third_party/WebKit/Source/core/dom/DOMRect.cpp
rename to third_party/WebKit/Source/core/geometry/DOMRect.cpp
index 002018a..70595ee5 100644
--- a/third_party/WebKit/Source/core/dom/DOMRect.cpp
+++ b/third_party/WebKit/Source/core/geometry/DOMRect.cpp
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/dom/DOMRect.h"
+#include "core/geometry/DOMRect.h"
 
-#include "core/dom/DOMRectInit.h"
+#include "core/geometry/DOMRectInit.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/dom/DOMRect.h b/third_party/WebKit/Source/core/geometry/DOMRect.h
similarity index 95%
rename from third_party/WebKit/Source/core/dom/DOMRect.h
rename to third_party/WebKit/Source/core/geometry/DOMRect.h
index b3d66dd0..b5401e2 100644
--- a/third_party/WebKit/Source/core/dom/DOMRect.h
+++ b/third_party/WebKit/Source/core/geometry/DOMRect.h
@@ -7,7 +7,7 @@
 
 #include "bindings/core/v8/Dictionary.h"
 #include "core/CoreExport.h"
-#include "core/dom/DOMRectReadOnly.h"
+#include "core/geometry/DOMRectReadOnly.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/dom/DOMRect.idl b/third_party/WebKit/Source/core/geometry/DOMRect.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMRect.idl
rename to third_party/WebKit/Source/core/geometry/DOMRect.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMRectInit.idl b/third_party/WebKit/Source/core/geometry/DOMRectInit.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMRectInit.idl
rename to third_party/WebKit/Source/core/geometry/DOMRectInit.idl
diff --git a/third_party/WebKit/Source/core/dom/DOMRectReadOnly.cpp b/third_party/WebKit/Source/core/geometry/DOMRectReadOnly.cpp
similarity index 91%
rename from third_party/WebKit/Source/core/dom/DOMRectReadOnly.cpp
rename to third_party/WebKit/Source/core/geometry/DOMRectReadOnly.cpp
index 6b6e515..757181b 100644
--- a/third_party/WebKit/Source/core/dom/DOMRectReadOnly.cpp
+++ b/third_party/WebKit/Source/core/geometry/DOMRectReadOnly.cpp
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/dom/DOMRectReadOnly.h"
+#include "core/geometry/DOMRectReadOnly.h"
 
 #include "bindings/core/v8/ScriptValue.h"
 #include "bindings/core/v8/V8ObjectBuilder.h"
-#include "core/dom/DOMRectInit.h"
+#include "core/geometry/DOMRectInit.h"
 
 namespace blink {
 
@@ -31,7 +31,8 @@
 }
 
 DOMRectReadOnly* DOMRectReadOnly::fromRect(const DOMRectInit& other) {
-  return new DOMRectReadOnly(other.x(), other.y(), other.width(), other.height());
+  return new DOMRectReadOnly(other.x(), other.y(), other.width(),
+                             other.height());
 }
 
 DOMRectReadOnly::DOMRectReadOnly(double x,
diff --git a/third_party/WebKit/Source/core/dom/DOMRectReadOnly.h b/third_party/WebKit/Source/core/geometry/DOMRectReadOnly.h
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMRectReadOnly.h
rename to third_party/WebKit/Source/core/geometry/DOMRectReadOnly.h
diff --git a/third_party/WebKit/Source/core/dom/DOMRectReadOnly.idl b/third_party/WebKit/Source/core/geometry/DOMRectReadOnly.idl
similarity index 100%
rename from third_party/WebKit/Source/core/dom/DOMRectReadOnly.idl
rename to third_party/WebKit/Source/core/geometry/DOMRectReadOnly.idl
diff --git a/third_party/WebKit/Source/core/geometry/OWNERS b/third_party/WebKit/Source/core/geometry/OWNERS
new file mode 100644
index 0000000..778a7d4
--- /dev/null
+++ b/third_party/WebKit/Source/core/geometry/OWNERS
@@ -0,0 +1,2 @@
+dominicc@chromium.org
+jinho.bang@samsung.com
\ No newline at end of file
diff --git a/third_party/WebKit/Source/core/html/BUILD.gn b/third_party/WebKit/Source/core/html/BUILD.gn
index 81857d11..48b43cf 100644
--- a/third_party/WebKit/Source/core/html/BUILD.gn
+++ b/third_party/WebKit/Source/core/html/BUILD.gn
@@ -13,6 +13,8 @@
     "AutoplayUmaHelper.h",
     "ClassList.cpp",
     "ClassList.h",
+    "CollectionItemsCache.h",
+    "CollectionType.h",
     "CrossOriginAttribute.cpp",
     "CrossOriginAttribute.h",
     "DocumentNameCollection.cpp",
@@ -47,6 +49,7 @@
     "HTMLDListElement.h",
     "HTMLDataListElement.cpp",
     "HTMLDataListElement.h",
+    "HTMLDataListOptionsCollection.h",
     "HTMLDetailsElement.cpp",
     "HTMLDetailsElement.h",
     "HTMLDialogElement.cpp",
@@ -264,6 +267,7 @@
     "URLRegistry.h",
     "ValidityState.cpp",
     "ValidityState.h",
+    "VoidCallback.h",
     "WindowNameCollection.cpp",
     "WindowNameCollection.h",
     "canvas/CanvasAsyncBlobCreator.cpp",
@@ -436,6 +440,7 @@
     "parser/InputStreamPreprocessor.h",
     "parser/MarkupTokenizerInlines.h",
     "parser/NestingLevelIncrementer.h",
+    "parser/ParserSynchronizationPolicy.h",
     "parser/PreloadRequest.cpp",
     "parser/PreloadRequest.h",
     "parser/ResourcePreloader.cpp",
@@ -507,6 +512,7 @@
     "track/TextTrackCue.h",
     "track/TextTrackCueList.cpp",
     "track/TextTrackCueList.h",
+    "track/TextTrackKindUserPreference.h",
     "track/TextTrackList.cpp",
     "track/TextTrackList.h",
     "track/TrackBase.cpp",
diff --git a/third_party/WebKit/Source/core/html/HTMLFormControlElement.cpp b/third_party/WebKit/Source/core/html/HTMLFormControlElement.cpp
index c30ad8b2..f0e9aa5a 100644
--- a/third_party/WebKit/Source/core/html/HTMLFormControlElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLFormControlElement.cpp
@@ -461,7 +461,7 @@
 
 void HTMLFormControlElement::updateVisibleValidationMessage() {
   Page* page = document().page();
-  if (!page || !page->isPageVisible())
+  if (!page || !page->isPageVisible() || document().unloadStarted())
     return;
   String message;
   if (layoutObject() && willValidate())
diff --git a/third_party/WebKit/Source/core/inspector/BUILD.gn b/third_party/WebKit/Source/core/inspector/BUILD.gn
index 38134bc..fa3b9c2d 100644
--- a/third_party/WebKit/Source/core/inspector/BUILD.gn
+++ b/third_party/WebKit/Source/core/inspector/BUILD.gn
@@ -37,6 +37,7 @@
     "InspectorDOMAgent.h",
     "InspectorDOMDebuggerAgent.cpp",
     "InspectorDOMDebuggerAgent.h",
+    "InspectorFrontendClient.h",
     "InspectorHighlight.cpp",
     "InspectorHighlight.h",
     "InspectorHistory.cpp",
@@ -45,6 +46,7 @@
     "InspectorInputAgent.h",
     "InspectorInstrumentation.cpp",
     "InspectorInstrumentation.h",
+    "InspectorInstrumentationCustomInl.h",
     "InspectorLayerTreeAgent.cpp",
     "InspectorLayerTreeAgent.h",
     "InspectorLogAgent.cpp",
diff --git a/third_party/WebKit/Source/core/layout/BUILD.gn b/third_party/WebKit/Source/core/layout/BUILD.gn
index b6075fc..1984af5 100644
--- a/third_party/WebKit/Source/core/layout/BUILD.gn
+++ b/third_party/WebKit/Source/core/layout/BUILD.gn
@@ -8,11 +8,13 @@
   split_count = 5
 
   sources = [
+    "BackgroundBleedAvoidance.h",
     "BidiRun.h",
     "BidiRunForLine.cpp",
     "BidiRunForLine.h",
     "ColumnBalancer.cpp",
     "ColumnBalancer.h",
+    "ContentChangeType.h",
     "CounterNode.cpp",
     "CounterNode.h",
     "DepthOrderedLayoutObjectList.cpp",
@@ -24,6 +26,7 @@
     "FragmentainerIterator.cpp",
     "FragmentainerIterator.h",
     "FragmentationContext.h",
+    "GapRects.h",
     "GeneratedChildren.h",
     "Grid.cpp",
     "Grid.h",
@@ -35,6 +38,7 @@
     "HitTestCanvasResult.h",
     "HitTestLocation.cpp",
     "HitTestLocation.h",
+    "HitTestRequest.h",
     "HitTestResult.cpp",
     "HitTestingTransformState.cpp",
     "HitTestingTransformState.h",
@@ -112,6 +116,7 @@
     "LayoutObject.cpp",
     "LayoutObjectChildList.cpp",
     "LayoutObjectChildList.h",
+    "LayoutObjectInlines.h",
     "LayoutPagedFlowThread.cpp",
     "LayoutPagedFlowThread.h",
     "LayoutPart.cpp",
@@ -194,6 +199,7 @@
     "LayoutWordBreak.h",
     "ListMarkerText.cpp",
     "ListMarkerText.h",
+    "MapCoordinatesFlags.h",
     "MultiColumnFragmentainerGroup.cpp",
     "MultiColumnFragmentainerGroup.h",
     "OrderIterator.cpp",
@@ -261,6 +267,8 @@
     "api/SelectionState.h",
     "compositing/CompositedLayerMapping.cpp",
     "compositing/CompositedLayerMapping.h",
+    "compositing/CompositedSelection.h",
+    "compositing/CompositedSelectionBound.h",
     "compositing/CompositingInputsUpdater.cpp",
     "compositing/CompositingInputsUpdater.h",
     "compositing/CompositingLayerAssigner.cpp",
@@ -280,6 +288,7 @@
     "line/AbstractInlineTextBox.cpp",
     "line/AbstractInlineTextBox.h",
     "line/BreakingContext.cpp",
+    "line/BreakingContextInlineHeaders.h",
     "line/EllipsisBox.cpp",
     "line/EllipsisBox.h",
     "line/GlyphOverflow.h",
@@ -287,15 +296,19 @@
     "line/InlineFlowBox.cpp",
     "line/InlineIterator.h",
     "line/InlineTextBox.cpp",
+    "line/LayoutTextInfo.h",
     "line/LineBoxList.cpp",
     "line/LineBoxList.h",
     "line/LineBreaker.cpp",
     "line/LineBreaker.h",
+    "line/LineInfo.h",
+    "line/LineLayoutState.h",
     "line/LineWidth.cpp",
     "line/LineWidth.h",
     "line/RootInlineBox.cpp",
     "line/TrailingObjects.cpp",
     "line/TrailingObjects.h",
+    "line/WordMeasurement.h",
     "ng/geometry/ng_box_strut.cc",
     "ng/geometry/ng_box_strut.h",
     "ng/geometry/ng_edge.h",
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
index ea8feb2..354e11b 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -1967,8 +1967,7 @@
     RefPtr<ComputedStyle> oldPseudoStyle =
         oldStyle.getCachedPseudoStyle(PseudoIdFirstLine);
     if (styleRef().hasPseudoStyle(PseudoIdFirstLine) && oldPseudoStyle) {
-      RefPtr<ComputedStyle> newPseudoStyle =
-          uncachedFirstLineStyle(mutableStyle());
+      RefPtr<ComputedStyle> newPseudoStyle = uncachedFirstLineStyle();
       if (newPseudoStyle) {
         firstLineStyleDidChange(*oldPseudoStyle, *newPseudoStyle);
         return;
@@ -3039,8 +3038,7 @@
       if (type == Cached)
         return firstLineBlock->getCachedPseudoStyle(PseudoIdFirstLine, style);
       return firstLineBlock->getUncachedPseudoStyle(
-          PseudoStyleRequest(PseudoIdFirstLine), style,
-          firstLineBlock == layoutObject ? style : 0);
+          PseudoStyleRequest(PseudoIdFirstLine), style);
     }
   } else if (!layoutObjectForFirstLineStyle->isAnonymous() &&
              layoutObjectForFirstLineStyle->isLayoutInline() &&
@@ -3058,20 +3056,19 @@
             PseudoIdFirstLineInherited, parentStyle);
       }
       return layoutObjectForFirstLineStyle->getUncachedPseudoStyle(
-          PseudoStyleRequest(PseudoIdFirstLineInherited), parentStyle, style);
+          PseudoStyleRequest(PseudoIdFirstLineInherited), parentStyle);
     }
   }
   return nullptr;
 }
 
-PassRefPtr<ComputedStyle> LayoutObject::uncachedFirstLineStyle(
-    ComputedStyle* style) const {
+PassRefPtr<ComputedStyle> LayoutObject::uncachedFirstLineStyle() const {
   if (!document().styleEngine().usesFirstLineRules())
     return nullptr;
 
   ASSERT(!isText());
 
-  return firstLineStyleForCachedUncachedType(Uncached, this, style);
+  return firstLineStyleForCachedUncachedType(Uncached, this, m_style.get());
 }
 
 ComputedStyle* LayoutObject::cachedFirstLineStyle() const {
@@ -3103,16 +3100,13 @@
 
 PassRefPtr<ComputedStyle> LayoutObject::getUncachedPseudoStyle(
     const PseudoStyleRequest& pseudoStyleRequest,
-    const ComputedStyle* parentStyle,
-    const ComputedStyle* ownStyle) const {
-  if (pseudoStyleRequest.pseudoId < FirstInternalPseudoId && !ownStyle &&
+    const ComputedStyle* parentStyle) const {
+  if (pseudoStyleRequest.pseudoId < FirstInternalPseudoId &&
       !style()->hasPseudoStyle(pseudoStyleRequest.pseudoId))
     return nullptr;
 
-  if (!parentStyle) {
-    ASSERT(!ownStyle);
+  if (!parentStyle)
     parentStyle = style();
-  }
 
   if (!node())
     return nullptr;
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h
index b142523..badb611 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -858,8 +858,7 @@
       const ComputedStyle* parentStyle = nullptr) const;
   PassRefPtr<ComputedStyle> getUncachedPseudoStyle(
       const PseudoStyleRequest&,
-      const ComputedStyle* parentStyle = nullptr,
-      const ComputedStyle* ownStyle = nullptr) const;
+      const ComputedStyle* parentStyle = nullptr) const;
 
   LayoutView* view() const { return document().layoutView(); }
   FrameView* frameView() const { return document().view(); }
@@ -1342,10 +1341,6 @@
     return style()->visitedDependentColor(colorProperty);
   }
 
-  // Used only by Element::pseudoStyleCacheIsInvalid to get a first line style
-  // based off of a given new style, without accessing the cache.
-  PassRefPtr<ComputedStyle> uncachedFirstLineStyle(ComputedStyle*) const;
-
   virtual CursorDirective getCursor(const LayoutPoint&, Cursor&) const;
 
   // Return the LayoutBoxModelObject in the container chain which is responsible
@@ -2070,6 +2065,10 @@
   }
 
  private:
+  // Used only by applyFirstLineChanges to get a first line style based off of a
+  // given new style, without accessing the cache.
+  PassRefPtr<ComputedStyle> uncachedFirstLineStyle() const;
+
   // Adjusts a visual rect in the space of |m_visualRect| to be in the
   // space of the |paintInvalidationContainer|, if needed. They can be different
   // only if |paintInvalidationContainer| is a composited scroller.
diff --git a/third_party/WebKit/Source/core/layout/api/LayoutItem.h b/third_party/WebKit/Source/core/layout/api/LayoutItem.h
index 34353289..5d7878d 100644
--- a/third_party/WebKit/Source/core/layout/api/LayoutItem.h
+++ b/third_party/WebKit/Source/core/layout/api/LayoutItem.h
@@ -229,10 +229,9 @@
 
   PassRefPtr<ComputedStyle> getUncachedPseudoStyle(
       const PseudoStyleRequest& pseudoStyleRequest,
-      const ComputedStyle* parentStyle = nullptr,
-      const ComputedStyle* ownStyle = nullptr) const {
+      const ComputedStyle* parentStyle = nullptr) const {
     return m_layoutObject->getUncachedPseudoStyle(pseudoStyleRequest,
-                                                  parentStyle, ownStyle);
+                                                  parentStyle);
   }
 
  protected:
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
index c1a9227..f3ffb66 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -119,12 +119,10 @@
   return false;
 }
 
-static inline bool isCanvasControlledByOffscreen(
-    const LayoutObject& layoutObject) {
+static inline bool isPlaceholderCanvas(const LayoutObject& layoutObject) {
   if (layoutObject.isCanvas()) {
     HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node());
-    if (canvas->surfaceLayerBridge())
-      return true;
+    return canvas->surfaceLayerBridge();
   }
   return false;
 }
@@ -469,6 +467,10 @@
     m_graphicsLayer->setContentsOpaque(false);
     m_backgroundLayer->setContentsOpaque(
         m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds()));
+  } else if (isPlaceholderCanvas(layoutObject())) {
+    // TODO(crbug.com/705019): Contents could be opaque, but that cannot be
+    // determined from the main thread. Or can it?
+    m_graphicsLayer->setContentsOpaque(false);
   } else {
     // For non-root layers, background is painted by the scrolling contents
     // layer if all backgrounds are background attachment local, otherwise
@@ -796,7 +798,7 @@
   } else if (layoutObject.isVideo()) {
     HTMLMediaElement* mediaElement = toHTMLMediaElement(layoutObject.node());
     m_graphicsLayer->setContentsToPlatformLayer(mediaElement->platformLayer());
-  } else if (isCanvasControlledByOffscreen(layoutObject)) {
+  } else if (isPlaceholderCanvas(layoutObject)) {
     HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node());
     m_graphicsLayer->setContentsToPlatformLayer(
         canvas->surfaceLayerBridge()->getWebLayer());
@@ -1408,16 +1410,6 @@
   IntRect overflowClipRect =
       pixelSnappedIntRect(layoutBox.overflowClipRect(LayoutPoint()));
 
-  const TopDocumentRootScrollerController& globalRootScrollerController =
-      layoutBox.document().page()->globalRootScrollerController();
-
-  if (&m_owningLayer == globalRootScrollerController.rootScrollerPaintLayer()) {
-    LayoutRect clipRect =
-        layoutBox.document().layoutView()->overflowClipRect(LayoutPoint());
-    DCHECK(clipRect.size() == LayoutSize(pixelSnappedIntRect(clipRect).size()));
-    overflowClipRect.setSize(pixelSnappedIntRect(clipRect).size());
-  }
-
   // When a m_childTransformLayer exists, local content offsets for the
   // m_scrollingLayer have already been applied. Otherwise, we apply them here.
   IntSize localContentOffset(0, 0);
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositingInputsUpdater.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositingInputsUpdater.cpp
index 5a1e96b..961a2f0 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositingInputsUpdater.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositingInputsUpdater.cpp
@@ -5,7 +5,6 @@
 #include "core/layout/compositing/CompositingInputsUpdater.h"
 
 #include "core/dom/Document.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/FrameView.h"
 #include "core/layout/LayoutBlock.h"
 #include "core/layout/LayoutView.h"
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
index 6d1f93cb3..3a801ac 100644
--- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
@@ -606,15 +606,6 @@
     return;
 
   FrameView* frameView = m_layoutView.frameView();
-
-  const TopDocumentRootScrollerController& globalRootScrollerController =
-      m_layoutView.document().page()->globalRootScrollerController();
-
-  // The global root scroller must always size to the root FrameView.
-  if (rootLayer() &&
-      rootLayer() == globalRootScrollerController.rootScrollerPaintLayer())
-    frameView = m_layoutView.document().topDocument().view();
-
   m_containerLayer->setSize(FloatSize(frameView->visibleContentSize()));
   m_overflowControlsHostLayer->setSize(
       FloatSize(frameView->visibleContentSize(IncludeScrollbars)));
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
index a67ae745..90efc23 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
@@ -187,13 +187,15 @@
     curr_margin_strut_ = NGMarginStrut();
   }
 
-  // Block that establishes a new BFC knows its BFC offset == {}
   // If a new formatting context hits the if branch above then the BFC offset is
   // still {} as the margin strut from the constraint space must also be empty.
   if (ConstraintSpace().IsNewFormattingContext()) {
     UpdateFragmentBfcOffset(curr_bfc_offset_);
-    DCHECK_EQ(builder_.BfcOffset().value(), NGLogicalOffset());
     DCHECK_EQ(curr_margin_strut_, NGMarginStrut());
+    // TODO(glebl): Uncomment the line below once we add the fragmentation
+    // support for floats.
+    // DCHECK_EQ(builder_.BfcOffset().value(), NGLogicalOffset());
+    curr_bfc_offset_ = {};
   }
 
   curr_bfc_offset_.block_offset += content_size_;
@@ -345,7 +347,8 @@
       toNGBlockNode(child)->Style().isFloating()) {
     RefPtr<NGFloatingObject> floating_object = NGFloatingObject::Create(
         child_space, constraint_space_, toNGBlockNode(child)->Style(),
-        curr_child_margins_, layout_result->PhysicalFragment().get());
+        curr_child_margins_, child_space->AvailableSize(),
+        layout_result->PhysicalFragment().get());
     builder_.AddUnpositionedFloat(floating_object);
     // No need to postpone the positioning if we know the correct offset.
     if (builder_.BfcOffset()) {
@@ -475,19 +478,20 @@
     NGLayoutInputNode* child) {
   DCHECK(child);
 
-  if (child->Type() == NGLayoutInputNode::kLegacyInline) {
+  const ComputedStyle& child_style = child->Style();
+  bool is_new_bfc =
+      IsNewFormattingContextForBlockLevelChild(ConstraintSpace(), child_style);
+  space_builder_.SetIsNewFormattingContext(is_new_bfc)
+      .SetBfcOffset(curr_bfc_offset_);
+
+  if (child->IsInline()) {
     // TODO(kojii): Setup space_builder_ appropriately for inline child.
     space_builder_.SetBfcOffset(curr_bfc_offset_);
     return space_builder_.ToConstraintSpace(
         FromPlatformWritingMode(Style().getWritingMode()));
   }
 
-  const ComputedStyle& child_style = toNGBlockNode(child)->Style();
-
-  bool is_new_bfc = IsNewFormattingContextForInFlowBlockLevelChild(
-      ConstraintSpace(), child_style);
-  space_builder_.SetIsNewFormattingContext(is_new_bfc)
-      .SetBfcOffset(curr_bfc_offset_)
+  space_builder_
       .SetClearanceOffset(
           GetClearanceOffset(constraint_space_->Exclusions(), child_style))
       .SetIsShrinkToFit(ShouldShrinkToFit(ConstraintSpace(), child_style))
@@ -508,6 +512,9 @@
     if (is_new_bfc) {
       DCHECK(builder_.BfcOffset());
       space_available -= curr_bfc_offset_.block_offset;
+      // TODO(glebl): We need to reset BFCOffset in ToConstraintSpace() after we
+      // started handling the fragmentation for floats.
+      space_builder_.SetBfcOffset(NGLogicalOffset());
     }
   }
   space_builder_.SetFragmentainerSpaceAvailable(space_available);
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc
index 2d850cc..1dce4ee 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc
@@ -233,49 +233,6 @@
       toNGPhysicalBoxFragment(container_fragment->Children()[0].get());
   // 0 = collapsed with container's margin
   EXPECT_THAT(LayoutUnit(0), first_child_fragment->TopOffset());
-
-  // ** Verify layout tree **
-  Element* first_child = document().getElementById("first-child");
-  int first_child_block_offset = body_top_offset;
-  EXPECT_EQ(first_child_block_offset, first_child->offsetTop());
-
-  // float-child-left is positioned at the top edge of the container padding box
-  Element* float_child_left = document().getElementById("float-child-left");
-  // 30 = std::max(first-child's margin 20, container's margin 10,
-  //      body's margin 8) + float-child-left's margin 10
-  int float_child_left_block_offset = 30;
-  EXPECT_EQ(float_child_left_block_offset, float_child_left->offsetTop());
-
-  // float-child-right is positioned at the top edge of container padding box
-  Element* float_child_right = document().getElementById("float-child-right");
-  // Should be equal to first_child_block_offset
-  // 20 = std::max(first-child's margin 20, container's margin 10,
-  //      body's margin 8)
-  int float_child_right_block_offset = 20;
-  EXPECT_EQ(float_child_right_block_offset, float_child_right->offsetTop());
-
-  // ** Verify exclusions **
-  // float-child-left's height(10) + padding(2x10) + margin(2x10) = 50px
-  NGLogicalSize exclusion1_size = {LayoutUnit(50), LayoutUnit(50)};
-  // float-child-left's inline offset
-  // 15 = body's margin(8) + container's inline padding(7)
-  NGLogicalOffset exclusion1_offset = {LayoutUnit(15),
-                                       LayoutUnit(first_child_block_offset)};
-  NGLogicalRect exclusion1_rect = {exclusion1_offset, exclusion1_size};
-  NGExclusion expected_exclusion1 = {exclusion1_rect, NGExclusion::kFloatLeft};
-
-  NGLogicalSize exclusion2_size = {LayoutUnit(30), LayoutUnit(30)};
-  // float-child-right's inline offset
-  // right_float_offset = 200 container's width - right float width 30 = 170
-  // 185 = body's margin(8) + right_float_offset(170) + container's padding(7)
-  NGLogicalOffset exclusion2_offset = {LayoutUnit(185),
-                                       LayoutUnit(first_child_block_offset)};
-  NGLogicalRect exclusion2_rect = {exclusion2_offset, exclusion2_size};
-  NGExclusion expected_exclusion2 = {exclusion2_rect, NGExclusion::kFloatRight};
-
-  EXPECT_THAT(space->Exclusions()->storage,
-              (ElementsAre(Pointee(expected_exclusion1),
-                           Pointee(expected_exclusion2))));
 }
 
 // Verifies the collapsing margins case for the next pairs:
@@ -339,7 +296,6 @@
   // -7 = empty1's margin(-15) + body's margin(8)
   int body_top_offset = -7;
   EXPECT_THAT(LayoutUnit(body_top_offset), body_fragment->TopOffset());
-  int body_left_offset = 8;
   EXPECT_THAT(LayoutUnit(body_top_offset), body_fragment->TopOffset());
   ASSERT_EQ(3UL, body_fragment->Children().size());
 
@@ -374,42 +330,6 @@
   Element* first_child = document().getElementById("first-child");
   // -7 = body_top_offset
   EXPECT_EQ(body_top_offset, first_child->offsetTop());
-
-  NGLogicalSize float_empties_exclusion_size = {LayoutUnit(30), LayoutUnit(30)};
-  NGLogicalOffset float_empties_exclusion_offset = {
-      LayoutUnit(body_left_offset), LayoutUnit(body_top_offset)};
-  NGLogicalRect float_empties_exclusion_rect = {float_empties_exclusion_offset,
-                                                float_empties_exclusion_size};
-  NGExclusion float_empties_exclusion = {float_empties_exclusion_rect,
-                                         NGExclusion::kFloatLeft};
-
-  NGLogicalSize float_nonempties_exclusion_size = {LayoutUnit(40),
-                                                   LayoutUnit(40)};
-  // 63 = first_child_margin_strut(20) + first-child's height(50) +
-  // body_top_offset(-7)
-  NGLogicalOffset float_nonempties_exclusion_offset = {
-      LayoutUnit(body_left_offset), LayoutUnit(63)};
-  NGLogicalRect float_nonempties_exclusion_rect = {
-      float_nonempties_exclusion_offset, float_nonempties_exclusion_size};
-  NGExclusion float_nonempties_exclusion = {float_nonempties_exclusion_rect,
-                                            NGExclusion::kFloatLeft};
-
-  NGLogicalSize float_top_align_exclusion_size = {LayoutUnit(50),
-                                                  LayoutUnit(50)};
-  // 63 = float_nonempties_exclusion_offset because of the top edge alignment
-  // rule.
-  // 48 = body's margin + float_nonempties_exclusion_size
-  NGLogicalOffset float_top_align_exclusion_offset = {LayoutUnit(48),
-                                                      LayoutUnit(63)};
-  NGLogicalRect float_top_align_exclusion_rect = {
-      float_top_align_exclusion_offset, float_top_align_exclusion_size};
-  NGExclusion float_top_align_exclusion = {float_top_align_exclusion_rect,
-                                           NGExclusion::kFloatLeft};
-
-  EXPECT_THAT(space->Exclusions()->storage,
-              (ElementsAre(Pointee(float_empties_exclusion),
-                           Pointee(float_nonempties_exclusion),
-                           Pointee(float_top_align_exclusion))));
 }
 
 // Verifies the collapsing margins case for the next pair:
@@ -1045,50 +965,6 @@
   // 10 = left_float_with_margin_inline_offset(18) - body's margin(8)
   EXPECT_THAT(LayoutUnit(left_float_with_margin_inline_offset - 8),
               left_float_with_margin_fragment->LeftOffset());
-
-  // ** Verify exclusions **
-  NGLogicalSize left_float_exclusion_size = {LayoutUnit(30), LayoutUnit(30)};
-  // this should be equal to body's margin(8)
-  NGLogicalOffset left_float_exclusion_offset = {LayoutUnit(8), LayoutUnit(8)};
-  NGLogicalRect left_float_exclusion_rect = {left_float_exclusion_offset,
-                                             left_float_exclusion_size};
-  NGExclusion left_float_exclusion = {left_float_exclusion_rect,
-                                      NGExclusion::kFloatLeft};
-
-  NGLogicalSize left_wide_exclusion_size = {LayoutUnit(180), LayoutUnit(30)};
-  NGLogicalOffset left_wide_exclusion_offset = {
-      LayoutUnit(8), LayoutUnit(left_wide_float_block_offset)};
-  NGLogicalRect left_wide_exclusion_rect = {left_wide_exclusion_offset,
-                                            left_wide_exclusion_size};
-  NGExclusion left_wide_exclusion = {left_wide_exclusion_rect,
-                                     NGExclusion::kFloatLeft};
-
-  NGLogicalSize right_float_exclusion_size = {LayoutUnit(50), LayoutUnit(50)};
-  NGLogicalOffset right_float_exclusion_offset = {
-      LayoutUnit(right_float_inline_offset),
-      LayoutUnit(right_float_block_offset)};
-  NGLogicalRect right_float_exclusion_rect = {right_float_exclusion_offset,
-                                              right_float_exclusion_size};
-  NGExclusion right_float_exclusion = {right_float_exclusion_rect,
-                                       NGExclusion::kFloatRight};
-
-  // left-float-with-margin's size(120) + margin(2x10)
-  NGLogicalSize left_float_with_margin_exclusion_size = {LayoutUnit(140),
-                                                         LayoutUnit(140)};
-  // Exclusion starts from the right_float_block_offset position.
-  NGLogicalOffset left_float_with_margin_exclusion_offset = {
-      LayoutUnit(8), LayoutUnit(right_float_block_offset)};
-  NGLogicalRect left_float_with_margin_exclusion_rect = {
-      left_float_with_margin_exclusion_offset,
-      left_float_with_margin_exclusion_size};
-  NGExclusion left_float_with_margin_exclusion = {
-      left_float_with_margin_exclusion_rect, NGExclusion::kFloatLeft};
-
-  EXPECT_THAT(
-      space->Exclusions()->storage,
-      (ElementsAre(Pointee(left_float_exclusion), Pointee(left_wide_exclusion),
-                   Pointee(right_float_exclusion),
-                   Pointee(left_float_with_margin_exclusion))));
 }
 
 // Verifies that NG block layout algorithm respects "clear" CSS property.
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc
index 1b6669b..e62c8bf4 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc
@@ -141,8 +141,8 @@
     layout_opp_iter_.reset();
 
   if (!layout_opp_iter_) {
-    layout_opp_iter_ =
-        WTF::makeUnique<NGLayoutOpportunityIterator>(this, iter_offset);
+    layout_opp_iter_ = WTF::makeUnique<NGLayoutOpportunityIterator>(
+        this, AvailableSize(), iter_offset);
   }
   return layout_opp_iter_.get();
 }
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
index 19740846..00f0a390 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
@@ -176,7 +176,9 @@
   // Reset things that do not pass the Formatting Context boundary.
   std::shared_ptr<NGExclusions> exclusions(
       is_new_fc_ ? std::make_shared<NGExclusions>() : exclusions_);
-  NGLogicalOffset bfc_offset = is_new_fc_ ? NGLogicalOffset() : bfc_offset_;
+  // TODO(glebl): Uncomment the line below once we add the fragmentation
+  // support for floats.
+  // NGLogicalOffset bfc_offset = is_new_fc_ ? NGLogicalOffset() : bfc_offset_;
   NGMarginStrut margin_strut = is_new_fc_ ? NGMarginStrut() : margin_strut_;
   WTF::Optional<LayoutUnit> clearance_offset =
       is_new_fc_ ? WTF::nullopt : clearance_offset_;
@@ -191,7 +193,8 @@
         is_inline_direction_triggers_scrollbar_,
         is_block_direction_triggers_scrollbar_,
         static_cast<NGFragmentationType>(fragmentation_type_), is_new_fc_,
-        is_anonymous_, margin_strut, bfc_offset, exclusions, clearance_offset));
+        is_anonymous_, margin_strut, bfc_offset_, exclusions,
+        clearance_offset));
   }
   return adoptRef(new NGConstraintSpace(
       out_writing_mode, static_cast<TextDirection>(text_direction_),
@@ -201,7 +204,7 @@
       is_block_direction_triggers_scrollbar_,
       is_inline_direction_triggers_scrollbar_,
       static_cast<NGFragmentationType>(fragmentation_type_), is_new_fc_,
-      is_anonymous_, margin_strut, bfc_offset, exclusions, clearance_offset));
+      is_anonymous_, margin_strut, bfc_offset_, exclusions, clearance_offset));
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
index 31513884..a36ea13 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
@@ -36,7 +36,7 @@
   RefPtr<NGConstraintSpace> space =
       ConstructConstraintSpace(kHorizontalTopBottom, TextDirection::kLtr, size);
 
-  NGLayoutOpportunityIterator iterator(space.get());
+  NGLayoutOpportunityIterator iterator(space.get(), space->AvailableSize());
   // 600x400 at (0,0)
   NGLayoutOpportunity opp1 = {{}, {LayoutUnit(600), LayoutUnit(400)}};
   EXPECT_EQ(opp1, iterator.Next());
@@ -56,7 +56,7 @@
   exclusion.rect.offset = {LayoutUnit(500), LayoutUnit()};
   space->AddExclusion(exclusion);
 
-  NGLayoutOpportunityIterator iterator(space.get());
+  NGLayoutOpportunityIterator iterator(space.get(), space->AvailableSize());
 
   // First opportunity should be to the left of the exclusion: 500x400 at (0,0)
   NGLayoutOpportunity opp1 = {{}, {LayoutUnit(500), LayoutUnit(400)}};
@@ -81,7 +81,7 @@
   exclusion.rect.size = {LayoutUnit(100), LayoutUnit(100)};
   space->AddExclusion(exclusion);
 
-  NGLayoutOpportunityIterator iterator(space.get());
+  NGLayoutOpportunityIterator iterator(space.get(), space->AvailableSize());
   // First opportunity should be to the right of the exclusion:
   // 500x400 at (100, 0)
   NGLayoutOpportunity opp1 = {{LayoutUnit(100), LayoutUnit()},
@@ -135,7 +135,7 @@
   exclusion2.rect.offset = {LayoutUnit(500), LayoutUnit(350)};
   space->AddExclusion(exclusion2);
 
-  NGLayoutOpportunityIterator iterator(space.get());
+  NGLayoutOpportunityIterator iterator(space.get(), space->AvailableSize());
   NGLogicalOffset start_point1;
   // 600x200 at (0,0)
   NGLayoutOpportunity opp1 = {start_point1, {LayoutUnit(600), LayoutUnit(200)}};
@@ -200,7 +200,8 @@
 
   const NGLogicalOffset origin_point = {LayoutUnit(), LayoutUnit(200)};
   const NGLogicalOffset leader_point = {LayoutUnit(250), LayoutUnit(300)};
-  NGLayoutOpportunityIterator iterator(space.get(), origin_point, leader_point);
+  NGLayoutOpportunityIterator iterator(space.get(), space->AvailableSize(),
+                                       origin_point, leader_point);
 
   NGLogicalOffset start_point1 = {LayoutUnit(250), LayoutUnit(200)};
   // 350x150 at (250,200)
@@ -259,7 +260,7 @@
   exclusion.rect.offset = {LayoutUnit(), LayoutUnit(150)};
   space->AddExclusion(exclusion);
 
-  NGLayoutOpportunityIterator iterator(space.get());
+  NGLayoutOpportunityIterator iterator(space.get(), space->AvailableSize());
   // 600x100 at (0,0)
   NGLayoutOpportunity opp = {{}, size};
   EXPECT_EQ(opp, iterator.Next());
@@ -287,7 +288,8 @@
   big_left.type = NGExclusion::kFloatLeft;
   space->AddExclusion(big_left);
 
-  NGLayoutOpportunityIterator iterator(space.get(), bfc_offset);
+  NGLayoutOpportunityIterator iterator(space.get(), space->AvailableSize(),
+                                       bfc_offset);
 
   NGLogicalOffset start_point1 = bfc_offset;
   start_point1.inline_offset +=
@@ -332,7 +334,8 @@
   big_right.type = NGExclusion::kFloatRight;
   space->AddExclusion(big_right);
 
-  NGLayoutOpportunityIterator iterator(space.get(), bfc_offset);
+  NGLayoutOpportunityIterator iterator(space.get(), space->AvailableSize(),
+                                       bfc_offset);
 
   NGLogicalOffset start_point1 = bfc_offset;
   // 170x200 at (8, 8)
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_floating_object.h b/third_party/WebKit/Source/core/layout/ng/ng_floating_object.h
index d876eed..6f86b19 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_floating_object.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_floating_object.h
@@ -6,6 +6,7 @@
 #define NGFloatingObject_h
 
 #include "core/layout/ng/geometry/ng_box_strut.h"
+#include "core/layout/ng/geometry/ng_logical_size.h"
 #include "core/layout/ng/ng_block_node.h"
 #include "core/layout/ng/ng_constraint_space.h"
 #include "core/layout/ng/ng_exclusion.h"
@@ -23,9 +24,10 @@
                                          const NGConstraintSpace* parent_space,
                                          const ComputedStyle& style,
                                          const NGBoxStrut& margins,
+                                         const NGLogicalSize& available_size,
                                          NGPhysicalFragment* fragment) {
-    return adoptRef(
-        new NGFloatingObject(space, parent_space, style, margins, fragment));
+    return adoptRef(new NGFloatingObject(space, parent_space, style, margins,
+                                         available_size, fragment));
   }
 
   // Original constraint space of the float.
@@ -38,6 +40,9 @@
   NGExclusion::Type exclusion_type;
   EClear clear_type;
   NGBoxStrut margins;
+  // Available size of the constraint space that will be used by
+  // NGLayoutOpportunityIterator to position this floaing object.
+  NGLogicalSize available_size;
 
   RefPtr<NGPhysicalFragment> fragment;
 
@@ -60,10 +65,12 @@
                    const NGConstraintSpace* parent_space,
                    const ComputedStyle& style,
                    const NGBoxStrut& margins,
+                   const NGLogicalSize& available_size,
                    NGPhysicalFragment* fragment)
       : space(space),
         original_parent_space(parent_space),
         margins(margins),
+        available_size(available_size),
         fragment(fragment) {
     exclusion_type = NGExclusion::kFloatLeft;
     if (style.floating() == EFloat::kRight)
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc
index 61b987bb..543000a 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc
@@ -40,16 +40,19 @@
 //                     establishes a new formatting context that we're currently
 //                     in and where all our exclusions reside.
 // @param margins Margins of the fragment.
+// @param available_size Available size used by the layout opportunity iterator.
 // @return Layout opportunity for the fragment.
 const NGLayoutOpportunity FindLayoutOpportunityForFragment(
     const NGConstraintSpace* space,
     const NGFragment& fragment,
     const NGLogicalOffset& origin_point,
-    const NGBoxStrut& margins) {
+    const NGBoxStrut& margins,
+    const NGLogicalSize& available_size) {
   NGLogicalOffset adjusted_origin_point =
       AdjustToTopEdgeAlignmentRule(*space, origin_point);
 
-  NGLayoutOpportunityIterator opportunity_iter(space, adjusted_origin_point);
+  NGLayoutOpportunityIterator opportunity_iter(space, available_size,
+                                               adjusted_origin_point);
   NGLayoutOpportunity opportunity;
   NGLayoutOpportunity opportunity_candidate = opportunity_iter.Next();
 
@@ -140,7 +143,8 @@
 
   // Find a layout opportunity that will fit our float.
   const NGLayoutOpportunity opportunity = FindLayoutOpportunityForFragment(
-      float_space, float_fragment, origin_point, floating_object->margins);
+      new_parent_space, float_fragment, origin_point, floating_object->margins,
+      floating_object->available_size);
   DCHECK(!opportunity.IsEmpty()) << "Opportunity is empty but it shouldn't be";
 
   // Calculate the float offset if needed.
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc
index fda9eb3..cb11e2a 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc
@@ -55,17 +55,15 @@
 
 // Creates layout opportunity from the provided space and the origin point.
 NGLayoutOpportunity CreateLayoutOpportunityFromConstraintSpace(
-    const NGConstraintSpace& space,
+    const NGLogicalSize& size,
     const NGLogicalOffset& origin_point) {
   NGLayoutOpportunity opportunity;
   // TODO(glebl): Perhaps fix other methods (e.g IsContained) instead of using
   // INT_MAX here.
-  opportunity.size.block_size = space.AvailableSize().block_size >= 0
-                                    ? space.AvailableSize().block_size
-                                    : LayoutUnit(INT_MAX);
-  opportunity.size.inline_size = space.AvailableSize().inline_size >= 0
-                                     ? space.AvailableSize().inline_size
-                                     : LayoutUnit(INT_MAX);
+  opportunity.size.block_size =
+      size.block_size >= 0 ? size.block_size : LayoutUnit(INT_MAX);
+  opportunity.size.inline_size =
+      size.inline_size >= 0 ? size.inline_size : LayoutUnit(INT_MAX);
 
   // adjust to the origin_point.
   opportunity.offset += origin_point;
@@ -276,6 +274,7 @@
 
 NGLayoutOpportunityIterator::NGLayoutOpportunityIterator(
     const NGConstraintSpace* space,
+    const NGLogicalSize& available_size,
     const WTF::Optional<NGLogicalOffset>& opt_offset,
     const WTF::Optional<NGLogicalOffset>& opt_leader_point)
     : constraint_space_(space),
@@ -287,7 +286,7 @@
       << "Exclusions are expected to be sorted by TOP";
 
   NGLayoutOpportunity initial_opportunity =
-      CreateLayoutOpportunityFromConstraintSpace(*constraint_space_, Offset());
+      CreateLayoutOpportunityFromConstraintSpace(available_size, Offset());
   opportunity_tree_root_.reset(
       new NGLayoutOpportunityTreeNode(initial_opportunity));
 
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.h b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.h
index 8a8eeae..cabc6106 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.h
@@ -31,6 +31,7 @@
   //                         represent a text fragment for example.
   NGLayoutOpportunityIterator(
       const NGConstraintSpace* space,
+      const NGLogicalSize& available_size,
       const WTF::Optional<NGLogicalOffset>& opt_offset = WTF::nullopt,
       const WTF::Optional<NGLogicalOffset>& opt_leader_point = WTF::nullopt);
 
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc b/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
index 8812b428..dfbcd72 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
@@ -36,7 +36,7 @@
     NGConstraintSpaceBuilder* space_builder) {
   DCHECK(space_builder) << "space_builder cannot be null here";
   bool is_new_bfc =
-      IsNewFormattingContextForInFlowBlockLevelChild(parent_space, style);
+      IsNewFormattingContextForBlockLevelChild(parent_space, style);
   return space_builder->SetIsNewFormattingContext(is_new_bfc)
       .SetTextDirection(style.direction())
       .SetIsShrinkToFit(ShouldShrinkToFit(parent_space, style))
@@ -309,11 +309,10 @@
 // TODO(glebl): Add the support of clearance for inline floats.
 void NGLineBuilder::LayoutAndPositionFloat(LayoutUnit end_position,
                                            LayoutObject* layout_object) {
-  LayoutNGBlockFlow* block_flow = toLayoutNGBlockFlow(layout_object);
-  NGBlockNode* node = new NGBlockNode(block_flow);
-
+  NGBlockNode* node = new NGBlockNode(layout_object);
   RefPtr<NGConstraintSpace> float_space = CreateConstraintSpaceForFloat(
       node->Style(), ConstraintSpace(), &space_builder_);
+
   // TODO(glebl): add the fragmentation support:
   // same writing mode - get the inline size ComputeInlineSizeForFragment to
   // determine if it fits on this line, then perform layout with the correct
@@ -327,7 +326,7 @@
 
   RefPtr<NGFloatingObject> floating_object = NGFloatingObject::Create(
       float_space.get(), constraint_space_, node->Style(), NGBoxStrut(),
-      layout_result->PhysicalFragment().get());
+      current_opportunity_.size, layout_result->PhysicalFragment().get());
 
   bool float_does_not_fit = end_position + float_fragment.InlineSize() >
                             current_opportunity_.InlineSize();
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_space_utils.cc b/third_party/WebKit/Source/core/layout/ng/ng_space_utils.cc
index 4c8143b0..d63d5e7 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_space_utils.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_space_utils.cc
@@ -19,11 +19,14 @@
   return value2;
 }
 
+bool IsOutOfFlowPositioned(const EPosition& position) {
+  return position == EPosition::kAbsolute || position == EPosition::kFixed;
+}
+
 }  // namespace
 
-bool IsNewFormattingContextForInFlowBlockLevelChild(
-    const NGConstraintSpace& space,
-    const ComputedStyle& style) {
+bool IsNewFormattingContextForBlockLevelChild(const NGConstraintSpace& space,
+                                              const ComputedStyle& style) {
   // TODO(layout-dev): This doesn't capture a few cases which can't be computed
   // directly from style yet:
   //  - The child is a <fieldset>.
@@ -31,6 +34,9 @@
   //    in a multi-col formatting context).
   //    (https://drafts.csswg.org/css-multicol-1/#valdef-column-span-all)
 
+  if (style.isFloating() || IsOutOfFlowPositioned(style.position()))
+    return true;
+
   if (style.specifiesColumns() || style.containsPaint() ||
       style.containsLayout())
     return true;
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_space_utils.h b/third_party/WebKit/Source/core/layout/ng/ng_space_utils.h
index 1ce6b779..1eb1a24f 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_space_utils.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_space_utils.h
@@ -14,11 +14,10 @@
 // Whether an in-flow block-level child creates a new formatting context.
 //
 // This will *NOT* check the following cases:
-//  - The child is out-of-flow, e.g. floating or abs-pos.
 //  - The child is a inline-level, e.g. "display: inline-block".
 //  - The child establishes a new formatting context, but should be a child of
 //    another layout algorithm, e.g. "display: table-caption" or flex-item.
-CORE_EXPORT bool IsNewFormattingContextForInFlowBlockLevelChild(
+CORE_EXPORT bool IsNewFormattingContextForBlockLevelChild(
     const NGConstraintSpace& space,
     const ComputedStyle& style);
 
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_space_utils_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_space_utils_test.cc
new file mode 100644
index 0000000..683e80464
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/ng_space_utils_test.cc
@@ -0,0 +1,47 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/layout/ng/ng_space_utils.h"
+
+#include "core/layout/ng/ng_constraint_space.h"
+#include "core/layout/ng/ng_constraint_space_builder.h"
+#include "core/style/ComputedStyle.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+namespace {
+
+class NGSpaceUtilsTest : public ::testing::Test {
+ protected:
+  NGSpaceUtilsTest() : space_builder_(NGWritingMode::kHorizontalTopBottom) {}
+
+  void SetUp() override { style_ = ComputedStyle::create(); }
+  RefPtr<ComputedStyle> style_;
+  NGConstraintSpaceBuilder space_builder_;
+};
+
+// Verifies that IsNewFormattingContextForInFlowBlockLevelChild returnes true
+// if the child is out-of-flow, e.g. floating or abs-pos.
+TEST_F(NGSpaceUtilsTest, NewFormattingContextForOutOfFlowChild) {
+  auto run_test = [&](const ComputedStyle& style) {
+    RefPtr<NGConstraintSpace> not_used_space =
+        space_builder_.ToConstraintSpace(NGWritingMode::kHorizontalTopBottom);
+    EXPECT_TRUE(
+        IsNewFormattingContextForBlockLevelChild(*not_used_space.get(), style));
+  };
+  RefPtr<ComputedStyle> style = ComputedStyle::create();
+  style->setFloating(EFloat::kLeft);
+  run_test(*style.get());
+
+  style = ComputedStyle::create();
+  style->setPosition(EPosition::kAbsolute);
+  run_test(*style.get());
+
+  style = ComputedStyle::create();
+  style->setPosition(EPosition::kFixed);
+  run_test(*style.get());
+}
+
+}  // namespace
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/loader/BUILD.gn b/third_party/WebKit/Source/core/loader/BUILD.gn
index e08b1f3..a440b4f 100644
--- a/third_party/WebKit/Source/core/loader/BUILD.gn
+++ b/third_party/WebKit/Source/core/loader/BUILD.gn
@@ -28,6 +28,7 @@
     "FrameLoader.h",
     "FrameLoaderStateMachine.cpp",
     "FrameLoaderStateMachine.h",
+    "FrameLoaderTypes.h",
     "HistoryItem.cpp",
     "HistoryItem.h",
     "HttpEquiv.cpp",
@@ -43,6 +44,7 @@
     "NavigationPolicy.h",
     "NavigationScheduler.cpp",
     "NavigationScheduler.h",
+    "NetworkHintsInterface.h",
     "PingLoader.cpp",
     "PingLoader.h",
     "PrerendererClient.cpp",
diff --git a/third_party/WebKit/Source/core/page/Page.cpp b/third_party/WebKit/Source/core/page/Page.cpp
index 257a0c5..0a37141 100644
--- a/third_party/WebKit/Source/core/page/Page.cpp
+++ b/third_party/WebKit/Source/core/page/Page.cpp
@@ -243,6 +243,11 @@
   m_mainFrame = mainFrame;
 }
 
+void Page::willUnloadDocument(const Document& document) {
+  if (m_validationMessageClient)
+    m_validationMessageClient->willUnloadDocument(document);
+}
+
 void Page::documentDetached(Document* document) {
   m_pointerLockController->documentDetached(document);
   m_contextMenuController->documentDetached(document);
diff --git a/third_party/WebKit/Source/core/page/Page.h b/third_party/WebKit/Source/core/page/Page.h
index 25f9144..676c71e 100644
--- a/third_party/WebKit/Source/core/page/Page.h
+++ b/third_party/WebKit/Source/core/page/Page.h
@@ -154,6 +154,7 @@
     return toLocalFrame(m_mainFrame);
   }
 
+  void willUnloadDocument(const Document&);
   void documentDetached(Document*);
 
   bool openedByDOM() const;
diff --git a/third_party/WebKit/Source/core/page/ValidationMessageClient.h b/third_party/WebKit/Source/core/page/ValidationMessageClient.h
index ba612c5..74e74c9 100644
--- a/third_party/WebKit/Source/core/page/ValidationMessageClient.h
+++ b/third_party/WebKit/Source/core/page/ValidationMessageClient.h
@@ -56,6 +56,7 @@
   // is visible.
   virtual bool isValidationMessageVisible(const Element& anchor) = 0;
 
+  virtual void willUnloadDocument(const Document&) = 0;
   virtual void documentDetached(const Document&) = 0;
 
   virtual void willBeDestroyed() = 0;
diff --git a/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp b/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp
index f6dc1e7f..d6a65c7 100644
--- a/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp
+++ b/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp
@@ -42,25 +42,6 @@
   recomputeGlobalRootScroller();
 }
 
-void TopDocumentRootScrollerController::mainFrameViewResized() {
-  Element* rootScroller = globalRootScroller();
-
-  ScrollableArea* area =
-      RootScrollerUtil::scrollableAreaForRootScroller(rootScroller);
-
-  if (!area)
-    return;
-
-  if (PaintLayer* layer = area->layer()) {
-    layer->setNeedsCompositingInputsUpdate();
-
-    // This is needed if the root scroller is an iframe, since the iframe
-    // doesn't have a scrolling/clip layer, its PLC has a container layer that
-    // needs to be resized instead.
-    layer->compositor()->frameViewDidChangeSize();
-  }
-}
-
 ScrollableArea* TopDocumentRootScrollerController::rootScrollerArea() const {
   return RootScrollerUtil::scrollableAreaForRootScroller(globalRootScroller());
 }
diff --git a/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.h b/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.h
index fd4071ee..96c7e3ac3 100644
--- a/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.h
+++ b/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.h
@@ -65,8 +65,6 @@
   // Called when the root scroller in any frames on the page has changed.
   void didChangeRootScroller();
 
-  void mainFrameViewResized();
-
   // Returns the ScrollableArea associated with the globalRootScroller(). Note,
   // this isn't necessarily the PLSA belonging to the root scroller Element's
   // LayoutBox.  If the root scroller is the documentElement then we use the
diff --git a/third_party/WebKit/Source/core/paint/BUILD.gn b/third_party/WebKit/Source/core/paint/BUILD.gn
index d6bc5ba2..a94728e 100644
--- a/third_party/WebKit/Source/core/paint/BUILD.gn
+++ b/third_party/WebKit/Source/core/paint/BUILD.gn
@@ -76,6 +76,7 @@
     "InlineTextBoxPainter.h",
     "LayerClipRecorder.cpp",
     "LayerClipRecorder.h",
+    "LayerHitTestRects.h",
     "LayoutObjectDrawingRecorder.h",
     "LineBoxListPainter.cpp",
     "LineBoxListPainter.h",
@@ -125,6 +126,7 @@
     "PaintPropertyTreeBuilder.h",
     "PaintPropertyTreePrinter.cpp",
     "PaintPropertyTreePrinter.h",
+    "PaintResult.h",
     "PaintTiming.cpp",
     "PaintTiming.h",
     "PartPainter.cpp",
diff --git a/third_party/WebKit/Source/core/paint/ObjectPaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/ObjectPaintInvalidator.cpp
index 256b397..e786211 100644
--- a/third_party/WebKit/Source/core/paint/ObjectPaintInvalidator.cpp
+++ b/third_party/WebKit/Source/core/paint/ObjectPaintInvalidator.cpp
@@ -492,6 +492,10 @@
   if (rect.isEmpty())
     return;
 
+  if (m_context.forcedSubtreeInvalidationFlags &
+      PaintInvalidatorContext::ForcedSubtreeNoRasterInvalidation)
+    return;
+
   // If the parent has fully invalidated and its visual rect covers this object
   // on the same backing, skip the invalidation.
   if (parentFullyInvalidatedOnSameBacking() &&
diff --git a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
index da03ef98..eeedfe7 100644
--- a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
@@ -461,6 +461,11 @@
     return;
   }
 
+  if (object.isSVGHiddenContainer()) {
+    context.forcedSubtreeInvalidationFlags |=
+        PaintInvalidatorContext::ForcedSubtreeNoRasterInvalidation;
+  }
+
   PaintInvalidationReason reason = object.invalidatePaintIfNeeded(context);
   switch (reason) {
     case PaintInvalidationDelayedFull:
diff --git a/third_party/WebKit/Source/core/paint/PaintInvalidator.h b/third_party/WebKit/Source/core/paint/PaintInvalidator.h
index fa3d084..37e609a2 100644
--- a/third_party/WebKit/Source/core/paint/PaintInvalidator.h
+++ b/third_party/WebKit/Source/core/paint/PaintInvalidator.h
@@ -54,6 +54,17 @@
     // TODO(crbug.com/637313): This is temporary before we support filters in
     // paint property tree.
     ForcedSubtreeSlowPathRect = 1 << 5,
+
+    // The paint invalidation tree walk invalidates paint caches, such as
+    // DisplayItemClients and subsequence caches, and also the regions
+    // into which objects raster pixels. When this flag is set, raster region
+    // invalidations are not issued.
+    //
+    // Context: some objects in this paint walk, for example SVG resource
+    // container subtress, don't actually have any raster regions, because they
+    // are used as "painting subroutines" for one or more other locations in
+    // SVG.
+    ForcedSubtreeNoRasterInvalidation = 1 << 6,
   };
   unsigned forcedSubtreeInvalidationFlags = 0;
 
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
index 04676b90..4f78103 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
@@ -26,16 +26,17 @@
 
 namespace blink {
 
-void PaintPropertyTreeBuilder::setupInitialContext(
-    PaintPropertyTreeBuilderContext& context) {
-  context.current.clip = context.absolutePosition.clip =
-      context.fixedPosition.clip = ClipPaintPropertyNode::root();
-  context.currentEffect = EffectPaintPropertyNode::root();
-  context.inputClipOfCurrentEffect = ClipPaintPropertyNode::root();
-  context.current.transform = context.absolutePosition.transform =
-      context.fixedPosition.transform = TransformPaintPropertyNode::root();
-  context.current.scroll = context.absolutePosition.scroll =
-      context.fixedPosition.scroll = ScrollPaintPropertyNode::root();
+PaintPropertyTreeBuilderContext::PaintPropertyTreeBuilderContext()
+    : containerForAbsolutePosition(nullptr),
+      currentEffect(EffectPaintPropertyNode::root()),
+      inputClipOfCurrentEffect(ClipPaintPropertyNode::root()),
+      forceSubtreeUpdate(false) {
+  current.clip = absolutePosition.clip = fixedPosition.clip =
+      ClipPaintPropertyNode::root();
+  current.transform = absolutePosition.transform = fixedPosition.transform =
+      TransformPaintPropertyNode::root();
+  current.scroll = absolutePosition.scroll = fixedPosition.scroll =
+      ScrollPaintPropertyNode::root();
 }
 
 // True if a new property was created, false if an existing one was updated.
@@ -1094,6 +1095,13 @@
 void PaintPropertyTreeBuilder::updatePropertiesForSelf(
     const LayoutObject& object,
     PaintPropertyTreeBuilderContext& context) {
+  if (object.isSVGHiddenContainer()) {
+    // SVG resources are painted within one or more other locations in the
+    // SVG during paint, and hence have their own independent paint property
+    // trees, paint offset, etc.
+    context = PaintPropertyTreeBuilderContext();
+  }
+
   // This is not in FindObjectPropertiesNeedingUpdateScope because paint offset
   // can change without needsPaintPropertyUpdate.
   updateForObjectLocationAndSize(object, context);
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h
index c55aeb1..ea7979e8 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h
@@ -90,11 +90,8 @@
   // property tree changes (i.e., a node is added or removed).
   bool forceSubtreeUpdate;
 
-  PaintPropertyTreeBuilderContext()
-      : containerForAbsolutePosition(nullptr),
-        currentEffect(nullptr),
-        inputClipOfCurrentEffect(nullptr),
-        forceSubtreeUpdate(false) {}
+  // Initializes all property tree nodes to the roots.
+  PaintPropertyTreeBuilderContext();
 };
 
 // Creates paint property tree nodes for special things in the layout tree.
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
index d8ed4c874..092fefa7 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
@@ -3329,4 +3329,69 @@
   EXPECT_EQ(FloatRoundedRect(8, 8, 100, 200), maskClip->clipRect());
 }
 
+TEST_P(PaintPropertyTreeBuilderTest, SVGResource) {
+  setBodyInnerHTML(
+      "<svg id='svg' xmlns='http://www.w3.org/2000/svg' >"
+      " <g transform='scale(1000)'>"
+      "   <marker id='markerMiddle'  markerWidth='2' markerHeight='2' refX='5' "
+      "       refY='5' markerUnits='strokeWidth'>"
+      "     <g id='transformInsideMarker' transform='scale(4)'>"
+      "       <circle cx='5' cy='5' r='7' fill='green'/>"
+      "     </g>"
+      "   </marker>"
+      " </g>"
+      " <g id='transformOutsidePath' transform='scale(2)'>"
+      "   <path d='M 130 135 L 180 135 L 180 185' "
+      "       marker-mid='url(#markerMiddle)' fill='none' stroke-width='8px' "
+      "       stroke='black'/>"
+      " </g>"
+      "</svg>");
+
+  const ObjectPaintProperties* transformInsideMarkerProperties =
+      paintPropertiesForElement("transformInsideMarker");
+  const ObjectPaintProperties* transformOutsidePathProperties =
+      paintPropertiesForElement("transformOutsidePath");
+  const ObjectPaintProperties* svgProperties = paintPropertiesForElement("svg");
+
+  // The <marker> object resets to a new paint property tree, so the
+  // transform within it should have the root as parent.
+  EXPECT_EQ(TransformPaintPropertyNode::root(),
+            transformInsideMarkerProperties->transform()->parent());
+
+  // Whereas this is not true of the transform above the path.
+  EXPECT_EQ(svgProperties->svgLocalToBorderBoxTransform(),
+            transformOutsidePathProperties->transform()->parent());
+}
+
+TEST_P(PaintPropertyTreeBuilderTest, SVGHiddenResource) {
+  setBodyInnerHTML(
+      "<svg id='svg' xmlns='http://www.w3.org/2000/svg' >"
+      " <g transform='scale(1000)'>"
+      "   <symbol id='symbol'>"
+      "     <g id='transformInsideSymbol' transform='scale(4)'>"
+      "       <circle cx='5' cy='5' r='7' fill='green'/>"
+      "     </g>"
+      "   </symbol>"
+      " </g>"
+      " <g id='transformOutsideUse' transform='scale(2)'>"
+      "   <use x='25' y='25' width='400' height='400' xlink:href='#symbol'/>"
+      " </g>"
+      "</svg>");
+
+  const ObjectPaintProperties* transformInsideSymbolProperties =
+      paintPropertiesForElement("transformInsideSymbol");
+  const ObjectPaintProperties* transformOutsideUseProperties =
+      paintPropertiesForElement("transformOutsideUse");
+  const ObjectPaintProperties* svgProperties = paintPropertiesForElement("svg");
+
+  // The <marker> object resets to a new paint property tree, so the
+  // transform within it should have the root as parent.
+  EXPECT_EQ(TransformPaintPropertyNode::root(),
+            transformInsideSymbolProperties->transform()->parent());
+
+  // Whereas this is not true of the transform above the path.
+  EXPECT_EQ(svgProperties->svgLocalToBorderBoxTransform(),
+            transformOutsideUseProperties->transform()->parent());
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
index 33cb5d7d..3286c5641 100644
--- a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
+++ b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
@@ -49,7 +49,6 @@
          DocumentLifecycle::InPrePaint);
 
   PrePaintTreeWalkContext initialContext(m_geometryMapper);
-  m_propertyTreeBuilder.setupInitialContext(*initialContext.treeBuilderContext);
   initialContext.ancestorTransformedOrRootPaintLayer =
       rootFrame.layoutView()->layer();
 
diff --git a/third_party/WebKit/Source/core/style/BUILD.gn b/third_party/WebKit/Source/core/style/BUILD.gn
index bdba137..f7563bf 100644
--- a/third_party/WebKit/Source/core/style/BUILD.gn
+++ b/third_party/WebKit/Source/core/style/BUILD.gn
@@ -12,19 +12,25 @@
     "AppliedTextDecoration.h",
     "BasicShapes.cpp",
     "BasicShapes.h",
+    "BorderData.h",
     "BorderEdge.cpp",
     "BorderEdge.h",
     "BorderImageLength.h",
     "BorderImageLengthBox.h",
+    "BorderValue.h",
     "CachedUAStyle.h",
     "ClipPathOperation.cpp",
     "ClipPathOperation.h",
+    "CollapsedBorderValue.h",
     "ComputedStyle.cpp",
     "ComputedStyle.h",
+    "ComputedStyleConstants.h",
     "ContentData.cpp",
     "ContentData.h",
+    "CounterContent.h",
     "CounterDirectives.cpp",
     "CounterDirectives.h",
+    "CursorData.h",
     "DataEquivalency.h",
     "DataPersistent.h",
     "DataRef.h",
@@ -35,10 +41,15 @@
     "FilterOperations.cpp",
     "FilterOperations.h",
     "GridArea.h",
+    "GridLength.h",
+    "GridPosition.h",
     "GridPositionsResolver.cpp",
     "GridPositionsResolver.h",
+    "GridTrackSize.h",
+    "LineClampValue.h",
     "NinePieceImage.cpp",
     "NinePieceImage.h",
+    "OutlineValue.h",
     "QuotesData.cpp",
     "QuotesData.h",
     "ShadowData.cpp",
@@ -52,6 +63,8 @@
     "StyleContentAlignmentData.h",
     "StyleDeprecatedFlexibleBoxData.cpp",
     "StyleDeprecatedFlexibleBoxData.h",
+    "StyleDifference.cpp",
+    "StyleDifference.h",
     "StyleFetchedImage.cpp",
     "StyleFetchedImage.h",
     "StyleFetchedImageSet.cpp",
@@ -87,6 +100,7 @@
     "StyleRareInheritedData.h",
     "StyleRareNonInheritedData.cpp",
     "StyleRareNonInheritedData.h",
+    "StyleReflection.h",
     "StyleScrollSnapData.cpp",
     "StyleScrollSnapData.h",
     "StyleSelfAlignmentData.h",
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
index 0a5208f..d1736af 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
@@ -345,8 +345,6 @@
   // The flags are copied one-by-one because m_nonInheritedData.m_contains a
   // bunch of stuff other than real style data.
   // See comments for each skipped flag below.
-  m_nonInheritedData.m_effectiveDisplay =
-      other.m_nonInheritedData.m_effectiveDisplay;
   m_nonInheritedData.m_originalDisplay =
       other.m_nonInheritedData.m_originalDisplay;
   m_nonInheritedData.m_verticalAlign = other.m_nonInheritedData.m_verticalAlign;
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h
index 590d3ae..c5478dda 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -206,8 +206,7 @@
   // don't inherit
   struct NonInheritedData {
     NonInheritedData()
-        : m_effectiveDisplay(static_cast<unsigned>(initialDisplay())),
-          m_originalDisplay(static_cast<unsigned>(initialDisplay())),
+        : m_originalDisplay(static_cast<unsigned>(initialDisplay())),
           m_verticalAlign(static_cast<unsigned>(initialVerticalAlign())),
           m_hasViewportUnits(false),
           m_hasRemUnits(false) {}
@@ -216,8 +215,7 @@
     // should not cause an inequality.
     bool operator==(const NonInheritedData& other) const {
       // Generated properties are compared in ComputedStyleBase
-      return m_effectiveDisplay == other.m_effectiveDisplay &&
-             m_originalDisplay == other.m_originalDisplay &&
+      return m_originalDisplay == other.m_originalDisplay &&
              m_verticalAlign == other.m_verticalAlign;
       // Differences in the following fields do not cause inequality:
       // hasViewportUnits
@@ -238,7 +236,6 @@
       return !(*this == other);
     }
 
-    unsigned m_effectiveDisplay : 5;  // EDisplay
     unsigned m_originalDisplay : 5;   // EDisplay
     unsigned m_verticalAlign : 4;     // EVerticalAlign
 
@@ -803,16 +800,9 @@
   void setContent(ContentData*);
 
   // display
-  static EDisplay initialDisplay() { return EDisplay::kInline; }
-  EDisplay display() const {
-    return static_cast<EDisplay>(m_nonInheritedData.m_effectiveDisplay);
-  }
   EDisplay originalDisplay() const {
     return static_cast<EDisplay>(m_nonInheritedData.m_originalDisplay);
   }
-  void setDisplay(EDisplay v) {
-    m_nonInheritedData.m_effectiveDisplay = static_cast<unsigned>(v);
-  }
   void setOriginalDisplay(EDisplay v) {
     m_nonInheritedData.m_originalDisplay = static_cast<unsigned>(v);
   }
diff --git a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
index c332bef..51ab626 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
@@ -295,32 +295,6 @@
   TextUnderlinePositionUnder
 };
 
-enum class EDisplay : unsigned {
-  kInline,
-  kBlock,
-  kListItem,
-  kInlineBlock,
-  kTable,
-  kInlineTable,
-  kTableRowGroup,
-  kTableHeaderGroup,
-  kTableFooterGroup,
-  kTableRow,
-  kTableColumnGroup,
-  kTableColumn,
-  kTableCell,
-  kTableCaption,
-  kWebkitBox,
-  kWebkitInlineBox,
-  kFlex,
-  kInlineFlex,
-  kGrid,
-  kInlineGrid,
-  kContents,
-  kFlowRoot,
-  kNone
-};
-
 enum ETransformStyle3D { TransformStyle3DFlat, TransformStyle3DPreserve3D };
 
 enum OffsetRotationType { OffsetRotationAuto, OffsetRotationFixed };
diff --git a/third_party/WebKit/Source/core/style/StyleDifference.cpp b/third_party/WebKit/Source/core/style/StyleDifference.cpp
new file mode 100644
index 0000000..ec4d70e7
--- /dev/null
+++ b/third_party/WebKit/Source/core/style/StyleDifference.cpp
@@ -0,0 +1,88 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/style/StyleDifference.h"
+
+namespace blink {
+
+std::ostream& operator<<(std::ostream& out, const StyleDifference& diff) {
+  out << "StyleDifference{layoutType=";
+
+  switch (diff.m_layoutType) {
+    case StyleDifference::NoLayout:
+      out << "NoLayout";
+      break;
+    case StyleDifference::PositionedMovement:
+      out << "PositionedMovement";
+      break;
+    case StyleDifference::FullLayout:
+      out << "FullLayout";
+      break;
+    default:
+      NOTREACHED();
+      break;
+  }
+
+  out << ", paintInvalidationType=";
+  switch (diff.m_paintInvalidationType) {
+    case StyleDifference::NoPaintInvalidation:
+      out << "NoPaintInvalidation";
+      break;
+    case StyleDifference::PaintInvalidationObject:
+      out << "PaintInvalidationObject";
+      break;
+    case StyleDifference::PaintInvalidationSubtree:
+      out << "PaintInvalidationSubtree";
+      break;
+    default:
+      NOTREACHED();
+      break;
+  }
+
+  out << ", recomputeOverflow=" << diff.m_recomputeOverflow;
+  out << ", visualRectUpdate=" << diff.m_visualRectUpdate;
+
+  out << ", propertySpecificDifferences=";
+  int diffCount = 0;
+  for (int i = 0; i < StyleDifference::PropertyDifferenceMax; i++) {
+    unsigned bitTest = 1 << i;
+    if (diff.m_propertySpecificDifferences & bitTest) {
+      if (diffCount++ > 0)
+        out << "|";
+      switch (bitTest) {
+        case StyleDifference::TransformChanged:
+          out << "TransformChanged";
+          break;
+        case StyleDifference::OpacityChanged:
+          out << "OpacityChanged";
+          break;
+        case StyleDifference::ZIndexChanged:
+          out << "ZIndexChanged";
+          break;
+        case StyleDifference::FilterChanged:
+          out << "FilterChanged";
+          break;
+        case StyleDifference::BackdropFilterChanged:
+          out << "BackdropFilterChanged";
+          break;
+        case StyleDifference::CSSClipChanged:
+          out << "CSSClipChanged";
+          break;
+        case StyleDifference::TextDecorationOrColorChanged:
+          out << "TextDecorationOrColorChanged";
+          break;
+        case StyleDifference::ScrollAnchorDisablingPropertyChanged:
+          out << "ScrollAnchorDisablingPropertyChanged";
+          break;
+        default:
+          NOTREACHED();
+          break;
+      }
+    }
+  }
+
+  return out << "}";
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/style/StyleDifference.h b/third_party/WebKit/Source/core/style/StyleDifference.h
index b775695..faafb52d 100644
--- a/third_party/WebKit/Source/core/style/StyleDifference.h
+++ b/third_party/WebKit/Source/core/style/StyleDifference.h
@@ -5,6 +5,8 @@
 #ifndef StyleDifference_h
 #define StyleDifference_h
 
+#include <iosfwd>
+#include "core/CoreExport.h"
 #include "wtf/Allocator.h"
 #include "wtf/Assertions.h"
 
@@ -27,6 +29,8 @@
     ScrollAnchorDisablingPropertyChanged = 1 << 7,
     // If you add a value here, be sure to update the number of bits on
     // m_propertySpecificDifferences.
+
+    PropertyDifferenceMax = TextDecorationOrColorChanged
   };
 
   StyleDifference()
@@ -139,6 +143,9 @@
   }
 
  private:
+  friend CORE_EXPORT std::ostream& operator<<(std::ostream&,
+                                              const StyleDifference&);
+
   enum PaintInvalidationType {
     NoPaintInvalidation,
     PaintInvalidationObject,
@@ -153,6 +160,8 @@
   unsigned m_propertySpecificDifferences : 8;
 };
 
+CORE_EXPORT std::ostream& operator<<(std::ostream&, const StyleDifference&);
+
 }  // namespace blink
 
 #endif  // StyleDifference_h
diff --git a/third_party/WebKit/Source/core/style/StyleDifferenceTest.cpp b/third_party/WebKit/Source/core/style/StyleDifferenceTest.cpp
new file mode 100644
index 0000000..5fdb6ed
--- /dev/null
+++ b/third_party/WebKit/Source/core/style/StyleDifferenceTest.cpp
@@ -0,0 +1,68 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/style/StyleDifference.h"
+
+#include <sstream>
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+TEST(StyleDifferenceTest, StreamOutputDefault) {
+  std::stringstream stringStream;
+  StyleDifference diff;
+  stringStream << diff;
+  EXPECT_EQ(
+      "StyleDifference{layoutType=NoLayout, "
+      "paintInvalidationType=NoPaintInvalidation, recomputeOverflow=0, "
+      "visualRectUpdate=0, propertySpecificDifferences=}",
+      stringStream.str());
+}
+
+TEST(StyleDifferenceTest, StreamOutputAllFieldsMutated) {
+  std::stringstream stringStream;
+  StyleDifference diff;
+  diff.setNeedsPaintInvalidationObject();
+  diff.setNeedsPositionedMovementLayout();
+  diff.setNeedsRecomputeOverflow();
+  diff.setNeedsVisualRectUpdate();
+  diff.setTransformChanged();
+  diff.setScrollAnchorDisablingPropertyChanged();
+  stringStream << diff;
+  EXPECT_EQ(
+      "StyleDifference{layoutType=PositionedMovement, "
+      "paintInvalidationType=PaintInvalidationObject, recomputeOverflow=1, "
+      "visualRectUpdate=1, "
+      "propertySpecificDifferences=TransformChanged|"
+      "ScrollAnchorDisablingPropertyChanged|TransformChanged|"
+      "ScrollAnchorDisablingPropertyChanged}",
+      stringStream.str());
+}
+
+TEST(StyleDifferenceTest, StreamOutputSetAllProperties) {
+  std::stringstream stringStream;
+  StyleDifference diff;
+  diff.setTransformChanged();
+  diff.setOpacityChanged();
+  diff.setZIndexChanged();
+  diff.setFilterChanged();
+  diff.setBackdropFilterChanged();
+  diff.setCSSClipChanged();
+  diff.setTextDecorationOrColorChanged();
+  diff.setScrollAnchorDisablingPropertyChanged();
+  stringStream << diff;
+  EXPECT_EQ(
+      "StyleDifference{layoutType=NoLayout, "
+      "paintInvalidationType=NoPaintInvalidation, recomputeOverflow=0, "
+      "visualRectUpdate=0, "
+      "propertySpecificDifferences=TransformChanged|OpacityChanged|"
+      "ZIndexChanged|FilterChanged|BackdropFilterChanged|CSSClipChanged|"
+      "TextDecorationOrColorChanged|ScrollAnchorDisablingPropertyChanged|"
+      "TransformChanged|OpacityChanged|ZIndexChanged|FilterChanged|"
+      "BackdropFilterChanged|CSSClipChanged|TextDecorationOrColorChanged|"
+      "ScrollAnchorDisablingPropertyChanged}",
+      stringStream.str());
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/svg/BUILD.gn b/third_party/WebKit/Source/core/svg/BUILD.gn
index 13835a5..c8589a1 100644
--- a/third_party/WebKit/Source/core/svg/BUILD.gn
+++ b/third_party/WebKit/Source/core/svg/BUILD.gn
@@ -34,8 +34,10 @@
     "SVGAnimateTransformElement.h",
     "SVGAnimatedAngle.cpp",
     "SVGAnimatedAngle.h",
+    "SVGAnimatedBoolean.h",
     "SVGAnimatedColor.cpp",
     "SVGAnimatedColor.h",
+    "SVGAnimatedEnumeration.h",
     "SVGAnimatedEnumerationBase.cpp",
     "SVGAnimatedEnumerationBase.h",
     "SVGAnimatedHref.cpp",
@@ -46,14 +48,20 @@
     "SVGAnimatedIntegerOptionalInteger.h",
     "SVGAnimatedLength.cpp",
     "SVGAnimatedLength.h",
+    "SVGAnimatedLengthList.h",
     "SVGAnimatedNumber.cpp",
     "SVGAnimatedNumber.h",
+    "SVGAnimatedNumberList.h",
     "SVGAnimatedNumberOptionalNumber.cpp",
     "SVGAnimatedNumberOptionalNumber.h",
     "SVGAnimatedPath.cpp",
     "SVGAnimatedPath.h",
+    "SVGAnimatedPointList.h",
+    "SVGAnimatedPreserveAspectRatio.h",
+    "SVGAnimatedRect.h",
     "SVGAnimatedString.cpp",
     "SVGAnimatedString.h",
+    "SVGAnimatedTransformList.h",
     "SVGAnimationElement.cpp",
     "SVGAnimationElement.h",
     "SVGBoolean.cpp",
@@ -164,6 +172,7 @@
     "SVGLengthContext.h",
     "SVGLengthList.cpp",
     "SVGLengthList.h",
+    "SVGLengthListTearOff.h",
     "SVGLengthTearOff.cpp",
     "SVGLengthTearOff.h",
     "SVGLineElement.cpp",
@@ -184,6 +193,7 @@
     "SVGNumber.h",
     "SVGNumberList.cpp",
     "SVGNumberList.h",
+    "SVGNumberListTearOff.h",
     "SVGNumberOptionalNumber.cpp",
     "SVGNumberOptionalNumber.h",
     "SVGNumberTearOff.cpp",
@@ -223,6 +233,7 @@
     "SVGPoint.h",
     "SVGPointList.cpp",
     "SVGPointList.h",
+    "SVGPointListTearOff.h",
     "SVGPointTearOff.cpp",
     "SVGPointTearOff.h",
     "SVGPolyElement.cpp",
@@ -324,6 +335,11 @@
     "graphics/filters/SVGFilterBuilder.h",
     "properties/SVGAnimatedProperty.cpp",
     "properties/SVGAnimatedProperty.h",
+    "properties/SVGListPropertyHelper.h",
+    "properties/SVGListPropertyTearOffHelper.h",
+    "properties/SVGProperty.h",
+    "properties/SVGPropertyHelper.h",
+    "properties/SVGPropertyInfo.h",
     "properties/SVGPropertyTearOff.cpp",
     "properties/SVGPropertyTearOff.h",
   ]
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp
index dabd8b7..04cfc281 100644
--- a/third_party/WebKit/Source/core/testing/Internals.cpp
+++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -45,7 +45,6 @@
 #include "core/dom/ClientRectList.h"
 #include "core/dom/DOMArrayBuffer.h"
 #include "core/dom/DOMNodeIds.h"
-#include "core/dom/DOMPoint.h"
 #include "core/dom/DOMStringList.h"
 #include "core/dom/Document.h"
 #include "core/dom/Element.h"
@@ -80,6 +79,7 @@
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Settings.h"
 #include "core/frame/VisualViewport.h"
+#include "core/geometry/DOMPoint.h"
 #include "core/html/HTMLContentElement.h"
 #include "core/html/HTMLIFrameElement.h"
 #include "core/html/HTMLImageElement.h"
diff --git a/third_party/WebKit/Source/devtools/.eslintignore b/third_party/WebKit/Source/devtools/.eslintignore
index 43d4667..36ce56b 100644
--- a/third_party/WebKit/Source/devtools/.eslintignore
+++ b/third_party/WebKit/Source/devtools/.eslintignore
@@ -6,7 +6,7 @@
 front_end/cm_modes/*
 front_end/cm_web_modes/*
 front_end/diff/diff_match_patch.js
-front_end/formatter_worker/acorn/acorn.js
+front_end/formatter_worker/acorn/*
 front_end/gonzales/gonzales-scss.js
 front_end/terminal/xterm.js/**
 front_end/protocol_externs.js
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn
index cd30c6f1..f969249 100644
--- a/third_party/WebKit/Source/devtools/BUILD.gn
+++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -214,7 +214,6 @@
   "front_end/extensions/module.json",
   "front_end/formatter_worker.js",
   "front_end/formatter_worker.json",
-  "front_end/formatter_worker/acorn/acorn.js",
   "front_end/formatter_worker/AcornTokenizer.js",
   "front_end/formatter_worker/CSSFormatter.js",
   "front_end/formatter_worker/CSSRuleParser.js",
@@ -225,8 +224,10 @@
   "front_end/formatter_worker/IdentityFormatter.js",
   "front_end/formatter_worker/JavaScriptFormatter.js",
   "front_end/formatter_worker/JavaScriptOutline.js",
-  "front_end/formatter_worker/module.json",
   "front_end/formatter_worker/RelaxedJSONParser.js",
+  "front_end/formatter_worker/acorn/acorn.js",
+  "front_end/formatter_worker/acorn/acorn_loose.js",
+  "front_end/formatter_worker/module.json",
   "front_end/gonzales/gonzales-scss.js",
   "front_end/gonzales/module.json",
   "front_end/gonzales/SCSSParser.js",
@@ -373,6 +374,7 @@
   "front_end/product_registry/module.json",
   "front_end/product_registry/ProductNameForURL.js",
   "front_end/product_registry/ProductRegistryData.js",
+  "front_end/product_registry/sha1/sha1.js",
   "front_end/profiler/BottomUpProfileDataGrid.js",
   "front_end/profiler/CPUProfileFlameChart.js",
   "front_end/profiler/CPUProfileView.js",
@@ -793,8 +795,8 @@
   "front_end/Images/resourceCSSIcon.png",
   "front_end/Images/resourceDocumentIcon.png",
   "front_end/Images/resourceDocumentIconSmall.png",
-  "front_end/Images/resourceGlyphs.png",
-  "front_end/Images/resourceGlyphs_2x.png",
+  "front_end/Images/mediumIcons.png",
+  "front_end/Images/mediumIcons_2x.png",
   "front_end/Images/resourceJSIcon.png",
   "front_end/Images/resourcePlainIcon.png",
   "front_end/Images/resourcePlainIconSmall.png",
@@ -808,8 +810,8 @@
   "front_end/Images/speech.png",
   "front_end/Images/treeoutlineTriangles.png",
   "front_end/Images/treeoutlineTriangles_2x.png",
-  "front_end/Images/toolbarButtonGlyphs.png",
-  "front_end/Images/toolbarButtonGlyphs_2x.png",
+  "front_end/Images/largeIcons.png",
+  "front_end/Images/largeIcons_2x.png",
   "front_end/Images/toolbarResizerVertical.png",
   "front_end/Images/touchCursor.png",
   "front_end/Images/touchCursor_2x.png",
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png
new file mode 100644
index 0000000..7e29efe
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png
new file mode 100644
index 0000000..13cf7bb2
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/mediumIcons.png b/third_party/WebKit/Source/devtools/front_end/Images/mediumIcons.png
new file mode 100644
index 0000000..dce7e5ce
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/Images/mediumIcons.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/mediumIcons_2x.png b/third_party/WebKit/Source/devtools/front_end/Images/mediumIcons_2x.png
new file mode 100644
index 0000000..b39d28ba4
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/Images/mediumIcons_2x.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/resourceGlyphs.png b/third_party/WebKit/Source/devtools/front_end/Images/resourceGlyphs.png
deleted file mode 100644
index fbbb22d..0000000
--- a/third_party/WebKit/Source/devtools/front_end/Images/resourceGlyphs.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/resourceGlyphs_2x.png b/third_party/WebKit/Source/devtools/front_end/Images/resourceGlyphs_2x.png
deleted file mode 100644
index b8cc2fd..0000000
--- a/third_party/WebKit/Source/devtools/front_end/Images/resourceGlyphs_2x.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/smallIcons.png b/third_party/WebKit/Source/devtools/front_end/Images/smallIcons.png
index 7cbfcba..abab09a9 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/smallIcons.png
+++ b/third_party/WebKit/Source/devtools/front_end/Images/smallIcons.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/smallIcons_2x.png b/third_party/WebKit/Source/devtools/front_end/Images/smallIcons_2x.png
index 18ae9d1..947338be 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/smallIcons_2x.png
+++ b/third_party/WebKit/Source/devtools/front_end/Images/smallIcons_2x.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg b/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg
new file mode 100644
index 0000000..de0452eb
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg
@@ -0,0 +1,1672 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="224"
+   height="216"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="largeIcons.svg">
+  <metadata
+     id="metadata606">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs604" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1601"
+     inkscape:window-height="1043"
+     id="namedview602"
+     showgrid="true"
+     inkscape:zoom="2.1851852"
+     inkscape:cx="128.41015"
+     inkscape:cy="83.191525"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3583"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       spacingx="28px"
+       spacingy="24px" />
+  </sodipodi:namedview>
+  <g
+     id="g4">
+    <svg
+       width="28"
+       height="24"
+       id="svg6"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         transform="translate(-322,-72)"
+         id="g8">
+        <circle
+           transform="translate(326,74)"
+           cx="15"
+           cy="17"
+           r="3"
+           id="circle10"
+           d="m 18,17 c 0,1.656854 -1.343146,3 -3,3 -1.656854,0 -3,-1.343146 -3,-3 0,-1.656854 1.343146,-3 3,-3 1.656854,0 3,1.343146 3,3 z"
+           sodipodi:cx="15"
+           sodipodi:cy="17"
+           sodipodi:rx="3"
+           sodipodi:ry="3"
+           style="fill:#009802" />
+        <path
+           d="m 329,77 h 18 v 18 h -18 z"
+           id="path12"
+           inkscape:connector-curvature="0"
+           style="fill:none" />
+        <path
+           d="m 327.25,75.25 h 20 v 20 h -20 z"
+           id="path14"
+           inkscape:connector-curvature="0"
+           style="fill:none" />
+        <path
+           d="m 325.12,73.125 h 20 v 20 h -20 z"
+           id="path16"
+           inkscape:connector-curvature="0"
+           style="fill:none" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(28,0)"
+     id="g18">
+    <svg
+       width="28"
+       height="24"
+       id="svg20"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-32,0)"
+         d="M 57,12 53.5,8 H 39 v 8 h 14.5"
+         id="path22"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(0,24)"
+     id="g24">
+    <svg
+       width="28"
+       height="24"
+       id="svg26"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-224,-120)"
+         d="m 240.77,127 h -1.534 v 4.233 h -4.233 v 1.534 h 4.233 V 137 h 1.534 v -4.233 h 4.233 v -1.534 H 240.77 V 127 z"
+         id="path28"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(28,24)"
+     id="g30">
+    <svg
+       width="28"
+       height="24"
+       id="svg32"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-96,-145)"
+         d="m 103,148 h 18 v 18 h -18 z"
+         id="path34"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-96,-145)"
+         d="m 115.42,154.7 -6.705,-6.705 -1.0575,1.0575 1.785,1.785 -3.8625,3.8625 c -0.4425,0.4425 -0.4425,1.155 0,1.59 l 4.125,4.125 c 0.2175,0.2175 0.51,0.33 0.795,0.33 0.285,0 0.5775,-0.1125 0.795,-0.33 l 4.125,-4.125 c 0.4425,-0.435 0.4425,-1.1475 0,-1.59 z m -8.5125,0.795 3.5925,-3.5925 3.5925,3.5925 h -7.185 z m 10.342,1.125 c 0,0 -1.5,1.6275 -1.5,2.625 0,0.825 0.675,1.5 1.5,1.5 0.825,0 1.5,-0.675 1.5,-1.5 0,-0.9975 -1.5,-2.625 -1.5,-2.625 z"
+         id="path36"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-96,-145)"
+         d="m 103,163 h 18 v 3 h -18 z"
+         id="path38"
+         inkscape:connector-curvature="0"
+         style="fill-opacity:0.36000001" />
+    </svg>
+  </g>
+  <g
+     transform="translate(0,48)"
+     id="g40">
+    <svg
+       width="28"
+       height="24"
+       id="svg42"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(7,3)"
+         d="M 0,0 H 18 V 18 H 0 z"
+         id="path44"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(7,3)"
+         d="m 13,5 h 1.4936 C 15.32558,5 16,5.67154 16,6.5064 v 7.9871 c 0,0.83198 -0.67154,1.5064 -1.5064,1.5064 H 6.5065 c -0.83198,0 -1.5064,-0.67154 -1.5064,-1.5064 v -1.4936 h 6.4936 c 0.8349,0 1.5064,-0.67446 1.5064,-1.5064 V 4.9999 z"
+         id="path46"
+         inkscape:connector-curvature="0"
+         style="fill-opacity:0.36000001" />
+      <path
+         transform="translate(7,3)"
+         d="M 3.5,2 C 2.669,2 2,2.669 2,3.5 v 8 C 2,12.331 2.669,13 3.5,13 h 8 c 0.831,0 1.5,-0.669 1.5,-1.5 v -8 C 13,2.669 12.331,2 11.5,2 h -8 z m 0,1.5 h 8 v 8 h -8 v -8 z"
+         id="path48"
+         inkscape:connector-curvature="0"
+         style="fill:#212121" />
+    </svg>
+  </g>
+  <g
+     transform="translate(28,48)"
+     id="g50">
+    <svg
+       width="28"
+       height="24"
+       id="svg52"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-96,-24)"
+         d="m 107,33 h 8 v 6 h -8 z"
+         stroke-miterlimit="4.2"
+         id="path54"
+         inkscape:connector-curvature="0"
+         style="stroke:#000000;stroke-width:2;stroke-miterlimit:4.19999981" />
+      <path
+         transform="translate(-96,-24)"
+         d="m 115,36 4,-4 v 8"
+         id="path56"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(56,0)"
+     id="g58">
+    <svg
+       width="28"
+       height="24"
+       id="svg60"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g62"
+         style="stroke:#000000">
+        <path
+           transform="matrix(0.36,0,0,0.36,-2.5,7.46)"
+           d="m 53,14 a 3,3 0 1 1 -6,0 3,3 0 1 1 6,0 z"
+           id="path64"
+           inkscape:connector-curvature="0"
+           style="fill-rule:evenodd;stroke-width:2.77800012" />
+        <path
+           transform="translate(-128,-120)"
+           d="m 143.48,129.5 2.5403,-2 h -1.5242 v -2 h -2 l -0.0161,2 h -1.5403 z"
+           id="path66"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="translate(-128,-120)"
+           d="m 146.5,132.5 2,2.5 v -1.4998 l 2,-1e-4 v -2.0002 l -2,1e-4 V 130 z"
+           id="path68"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="translate(-128,-120)"
+           d="m 143.5,135.5 -2.5,2 h 1.5 v 2 h 2 v -2 h 1.5 z"
+           id="path70"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="translate(-128,-120)"
+           d="m 140.5,132.5 -2,-2.5 v 1.4999 h -2 v 2.0002 l 2,-3e-4 V 135 z"
+           id="path72"
+           inkscape:connector-curvature="0" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(56,24)"
+     id="g74">
+    <svg
+       width="28"
+       height="24"
+       id="svg76"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g78"
+         style="fill-rule:evenodd">
+        <path
+           transform="matrix(0.9018,0,0,0.9018,4.308,4.525)"
+           d="M 0,0 H 18 V 18 H 0 z"
+           id="path80"
+           inkscape:connector-curvature="0"
+           style="fill:none" />
+        <path
+           transform="matrix(0.9018,0,0,0.9018,4.308,4.525)"
+           d="M 4.174,8.343 2.76,9.757 7.003,13.999 15.488,5.514 14.074,4.1 7.003,11.171 z"
+           id="path82"
+           inkscape:connector-curvature="0" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(56,48)"
+     id="g84">
+    <svg
+       width="28"
+       height="24"
+       id="svg86"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-68,-143)"
+         d="M 76.94,152 76,152.94 79.0533,156 76,159.06 l 0.94,0.94 4,-4 z"
+         id="path88"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-68,-143)"
+         d="M 80.94,152 80,152.94 83.0533,156 80,159.06 l 0.94,0.94 4,-4 z"
+         id="path90"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(0,72)"
+     id="g92">
+    <svg
+       width="28"
+       height="24"
+       id="svg94"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-64,0)"
+         d="m 80.44,16.94 c -2.48,0 -4.5,-2.02 -4.5,-4.5 0,-0.88 0.26,-1.7 0.69,-2.39 l 6.2,6.2 c -0.69,0.44 -1.51,0.69 -2.39,0.69 m 4.5,-4.5 c 0,0.88 -0.26,1.7 -0.69,2.39 l -6.2,-6.2 c 0.69,-0.44 1.51,-0.69 2.39,-0.69 2.48,0 4.5,2.02 4.5,4.5 M 80.5,6 C 76.91,6 74,8.91 74,12.5 74,16.09 76.91,19 80.5,19 84.09,19 87,16.09 87,12.5 87,8.91 84.09,6 80.5,6"
+         id="path96"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(28,72)"
+     id="g98">
+    <svg
+       width="28"
+       height="24"
+       id="svg100"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g102"
+         style="fill-rule:evenodd">
+        <path
+           transform="matrix(0.87153,0,0,0.87153,4.071,4.568)"
+           d="M 0,0 H 18 V 18 H 0 z"
+           id="path104"
+           inkscape:connector-curvature="0"
+           style="fill:none" />
+        <path
+           transform="matrix(0.87153,0,0,0.87153,4.071,4.568)"
+           d="M 12,3.5 A 1.505,1.505 0 0 0 10.494,2 H 4.506 C 3.676,2 3,2.674 3,3.506 v 7.988 C 3,12.326 3.671,12.997 4.5,13 V 3.5 H 12 z M 6,6.506 C 6,5.674 6.676,5 7.506,5 h 5.988 C 14.326,5 15,5.672 15,6.506 v 7.988 C 15,15.326 14.324,16 13.494,16 H 7.506 A 1.505,1.505 0 0 1 6,14.494 V 6.506 z M 7.5,6.5 h 6 v 8 h -6 v -8 z"
+           id="path106"
+           inkscape:connector-curvature="0" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(56,72)"
+     id="g108">
+    <svg
+       width="28"
+       height="24"
+       id="svg110"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(0,-24)"
+         d="M 25,36 21.36,32 H 19.57 L 14,40 h 7.36 L 25,36 z"
+         id="path112"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-24)"
+         d="m 7,32 v 8 H 9.05 L 14,32 H 7 z"
+         id="path114"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-24)"
+         d="M 9.67,44.55 8.08,43.23 18.84,27.45 20.43,28.77 9.67,44.55 z"
+         id="path116"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-24)"
+         d="M 0,24 H 24 V 48 H 0 z"
+         id="path118"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(0,-24)"
+         d="M 0,24 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z"
+         id="path120"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(0,-24)"
+         d="M 0,24 H 24 V 48 H 0 z"
+         id="path122"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(0,-24)"
+         d="M 0,24 H 24 V 48 H 0 z"
+         id="path124"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(0,-24)"
+         d="M 0,24 H 24 V 48 H 0 z"
+         id="path126"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+    </svg>
+  </g>
+  <g
+     transform="translate(84,0)"
+     id="g128">
+    <svg
+       width="28"
+       height="24"
+       id="svg130"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-128,0)"
+         d="M 149,8.33 147.67,7 144,10.67 140.33,7 139,8.33 142.67,12 139,15.67 140.33,17 144,13.33 147.67,17 149,15.67 145.33,12 149,8.33 z"
+         id="path132"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(84,24)"
+     id="g134">
+    <svg
+       width="28"
+       height="24"
+       id="svg136"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-32,-24)"
+         d="M 53,37 H 43 v -5 h 10 v 5 z M 41,42 H 55 V 30 H 41 v 12 z"
+         id="path138"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(84,48)"
+     id="g140">
+    <svg
+       width="28"
+       height="24"
+       id="svg142"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-224,-48)"
+         d="m 238,64 h 7 v -8 h -7 z m 9,2 H 233 V 54 h 14 z"
+         id="path144"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(84,72)"
+     id="g146">
+    <svg
+       width="28"
+       height="24"
+       id="svg148"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-256,-48)"
+         d="m 274,64 h -7 v -8 h 7 v 8 z m -9,2 h 14 V 54 h -14 v 12 z"
+         id="path150"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(0,96)"
+     id="g152">
+    <svg
+       width="28"
+       height="24"
+       id="svg154"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-160,0)"
+         d="m 169,16.089 v 2.9105 h 2.9105 L 180.1944,10.7156 177.2838,7.8051 169,16.089 z m 13.769,-7.9387 c 0.30785,-0.30785 0.30785,-0.79294 0,-1.1008 l -1.8191,-1.8191 c -0.30785,-0.30784 -0.79295,-0.30784 -1.1008,0 l -1.5206,1.5299 2.9105,2.9105 1.5299,-1.5206 z"
+         id="path156"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(28,96)"
+     id="g158">
+    <svg
+       width="28"
+       height="24"
+       id="svg160"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-288,-120)"
+         d="m 310.77,127.04 -1.816,-1.8164 c -0.30331,-0.30338 -0.79716,-0.30338 -1.1005,0 l -2.4304,2.4309 -1.4894,-1.4935 -1.1005,1.1007 1.1044,1.1046 -6.9373,6.9348 v 3.695 h 3.6942 l 6.9373,-6.9387 1.1005,1.1046 1.1005,-1.1007 -1.4932,-1.4935 2.4304,-2.4309 c 0.3072,-0.30338 0.3072,-0.79345 0,-1.0968 z m -10.721,10.4 -1.4932,-1.4935 6.2724,-6.2736 1.4932,1.4935 -6.2723,6.2736 z"
+         id="path162"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(56,96)"
+     id="g164">
+    <svg
+       width="28"
+       height="24"
+       id="svg166"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-32,-48)"
+         d="m 44,59 2,3 v 4 h 4 v -4 l 2,-3 z"
+         id="path168"
+         inkscape:connector-curvature="0"
+         style="opacity:0.5;fill:#424242" />
+      <path
+         transform="translate(-32,-48)"
+         d="m 46.5,65.23 c 0.32,0.13 0.84,0.24 1.47,0.24 0.59,0 1.14,-0.1 1.53,-0.26 v -3.93 l 4,-4.57 v -0.19 h -11 v 0.22 l 4,4.57 v 3.93 z M 47.97,67 C 46.81,66.91 45.82,66.71 45,66.01 V 61.89 L 41,57.32 V 55 h 14 v 2.35 l -4,4.57 v 4.13 c -0.92,0.67 -2.1,0.94 -3.03,0.95"
+         id="path170"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(84,96)"
+     id="g172">
+    <svg
+       width="28"
+       height="24"
+       id="svg174"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(0.75,0,0,0.75,-74.421,-143.43)"
+         d="m 108.56,195.24 h 24 v 24 h -24 z"
+         id="path176"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="matrix(0.75,0,0,0.75,-74.421,-143.43)"
+         d="m 108.56,215.24 h 24 v 4 h -24 z"
+         id="path178"
+         inkscape:connector-curvature="0"
+         style="fill-opacity:0.36000001" />
+      <path
+         transform="matrix(0.75,0,0,0.75,-74.421,-143.43)"
+         d="m 119.56,198.24 -5.5,14 h 2.25 l 1.12,-3 h 6.25 l 1.12,3 h 2.25 l -5.49,-14 h -2 z m -1.38,9 2.38,-6.33 2.38,6.33 h -4.76 z"
+         id="path180"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(112,0)"
+     id="g182">
+    <svg
+       width="28"
+       height="24"
+       id="svg184"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(0,-1,1,0,-112,-260)"
+         d="m -278.5,126.5 h 14 v 12 h -14 z"
+         id="path186"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000" />
+      <path
+         transform="matrix(0,1,1,0,-112,-260)"
+         d="m 272,132.5 -5,-3.25 v 6.5"
+         id="path188"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0,-1,1,0,-112,-260)"
+         d="m -275,126 h 1 v 13 h -1 z"
+         id="path190"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(112,24)"
+     id="g192">
+    <svg
+       width="28"
+       height="24"
+       id="svg194"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-192,-72)"
+         d="m 200.5,78.5 h 14 v 12 h -14 z"
+         id="path196"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000" />
+      <path
+         transform="translate(-192,-72)"
+         d="m 207,84.5 5,-3.25 v 6.5"
+         id="path198"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-192,-72)"
+         d="m 204,78 h 1 v 13 h -1 z"
+         id="path200"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(112,48)"
+     id="g202">
+    <svg
+       width="28"
+       height="24"
+       id="svg204"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(-1,0,0,1,-192,-120)"
+         d="m -214.5,126.5 h 14 v 12 h -14 z"
+         id="path206"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000" />
+      <path
+         transform="translate(-192,-120)"
+         d="m 208,132.5 -5,-3.25 v 6.5"
+         id="path208"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(-1,0,0,1,-192,-120)"
+         d="m -211,126 h 1 v 13 h -1 z"
+         id="path210"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(112,72)"
+     id="g212">
+    <svg
+       width="28"
+       height="24"
+       id="svg214"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(0,1,1,0,-88,283)"
+         d="m -278.5,102.5 h 14 v 12 h -14 z"
+         id="path216"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000" />
+      <path
+         transform="matrix(0,-1,1,0,-88,283)"
+         d="m 272,108.5 -5,-3.25 v 6.5"
+         id="path218"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0,1,1,0,-88,283)"
+         d="m -275,102 h 1 v 13 h -1 z"
+         id="path220"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(112,96)"
+     id="g222">
+    <svg
+       width="28"
+       height="24"
+       id="svg224"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-224,0)"
+         d="m 237,11 h -4 V 7 h 4 v 4 z"
+         id="path226"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-224,0)"
+         d="m 247,9 h -9 V 7 h 9 v 2 z"
+         id="path228"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-224,0)"
+         d="m 247,11 h -9 v -1 h 9 v 1 z"
+         id="path230"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-224,0)"
+         d="m 247,15 h -9 v -2 h 9 v 2 z"
+         id="path232"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-224,0)"
+         d="m 237,17 h -4 v -4 h 4 v 4 z"
+         id="path234"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-224,0)"
+         d="m 247,17 h -9 v -1 h 9 v 1 z"
+         id="path236"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(0,120)"
+     id="g238">
+    <svg
+       width="28"
+       height="24"
+       id="svg240"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(0,-144)"
+         d="m 23,157 h -2 v 2 h 2 z"
+         id="path242"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-144)"
+         d="m 23,161 h -2 v 2 c 1,0 2,-1 2,-2 z"
+         id="path244"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-144)"
+         d="m 23,153 h -2 v 2 h 2 z"
+         id="path246"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-144)"
+         d="m 21,149 v 2 h 2 c 0,-1 -1,-2 -2,-2 z"
+         id="path248"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-144)"
+         d="m 11,163 h 4 v -6 H 9 v 4 c 0,1.1 0.9,2 2,2 z"
+         id="path250"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-144)"
+         d="M 11,153 H 9 v 2 h 2 z"
+         id="path252"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-144)"
+         d="m 19,149 h -2 v 2 h 2 z"
+         id="path254"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-144)"
+         d="m 19,161 h -2 v 2 h 2 z"
+         id="path256"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-144)"
+         d="m 11,149 c -1,0 -2,1 -2,2 h 2 z"
+         id="path258"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-144)"
+         d="m 15,149 h -2 v 2 h 2 z"
+         id="path260"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(28,120)"
+     id="g262">
+    <svg
+       width="28"
+       height="24"
+       id="svg264"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-290,-46)"
+         d="m 317,69 v -5 l -5,5 h 5 z"
+         id="path266"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(56,120)"
+     id="g268">
+    <svg
+       width="28"
+       height="24"
+       id="svg270"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g272"
+         style="fill-rule:evenodd">
+        <path
+           transform="matrix(1.4142,0,0,1.4142,-278.88,-36.772)"
+           d="m 209.92,31.305 a 1.0607,1.0607 0 1 1 -2.1213,0 1.0607,1.0607 0 1 1 2.1213,0 z"
+           id="path274"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(1.4142,0,0,1.4142,-278.88,-31.772)"
+           d="m 209.92,31.305 a 1.0607,1.0607 0 1 1 -2.1213,0 1.0607,1.0607 0 1 1 2.1213,0 z"
+           id="path276"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(1.4142,0,0,1.4142,-278.88,-26.772)"
+           d="m 209.92,31.305 a 1.0607,1.0607 0 1 1 -2.1213,0 1.0607,1.0607 0 1 1 2.1213,0 z"
+           id="path278"
+           inkscape:connector-curvature="0" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(84,120)"
+     id="g280">
+    <svg
+       width="28"
+       height="24"
+       id="svg282"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-162,-144)"
+         d="m 166,147 h 18 v 18 h -18 z"
+         id="path284"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-162,-144)"
+         d="m 181.52,154.53 c -0.51,-2.58 -2.7862,-4.5262 -5.5162,-4.5262 -2.1675,0 -4.0462,1.23 -4.9875,3.0262 -2.2538,0.24375 -4.0125,2.1525 -4.0125,4.4738 0,2.4862 2.0138,4.5 4.5,4.5 h 9.75 c 2.07,0 3.75,-1.68 3.75,-3.75 0,-1.98 -1.5412,-3.585 -3.4838,-3.7238 z m -0.26625,5.9738 h -9.75 c -1.6575,0 -3,-1.3425 -3,-3 0,-1.6575 1.3425,-3 3,-3 h 0.5325 c 0.49125,-1.7288 2.0775,-3 3.9675,-3 2.28,0 4.125,1.845 4.125,4.125 v 0.375 h 1.125 c 1.2412,0 2.25,1.0088 2.25,2.25 0,1.2412 -1.0088,2.25 -2.25,2.25 z"
+         id="path286"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(112,120)"
+     id="g288">
+    <svg
+       width="28"
+       height="24"
+       id="svg290"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-226,-72)"
+         d="m 235,76 c -0.55,0 -0.99,0.45 -0.99,1 L 234,91 c 0,0.55 0.44,1 1,1 h 10 c 0.55,0 1,-0.45 1,-1 V 81 l -5,-5 h -6 z m 6,5 v -4 l 4,4 h -4 z"
+         id="path292"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-226,-72)"
+         d="m 231,75 h 18 v 18 h -18 z"
+         id="path294"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+    </svg>
+  </g>
+  <g
+     transform="translate(140,0)"
+     id="g296">
+    <svg
+       width="28"
+       height="24"
+       id="svg298"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-162,-24)"
+         d="m 169,29 h 18 v 18 h -18 z"
+         id="path300"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-162,-24)"
+         d="m 167.25,27.25 h 20 v 20 h -20 z"
+         id="path302"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-162,-24)"
+         d="m 165.12,25.125 h 20 v 20 h -20 z"
+         id="path304"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-162,-24)"
+         d="m 171,28 c -0.55,0 -1,0.45 -1,1 v 14 c 0,0.55 0.44,1 1,1 h 5.0938 c -0.0656,-0.32311 -0.0937,-0.65753 -0.0937,-1 0,-2.7614 2.2386,-5 5,-5 0.34247,0 0.67689,0.02816 1,0.09375 v -5.0938 l -5,-5 h -6 z m 6,1 4,4 h -4 v -4 z"
+         id="path306"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(140,24)"
+     id="g308">
+    <svg
+       width="28"
+       height="24"
+       id="svg310"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-66,-120)"
+         d="m 71,124 h 18 v 18 H 71 z"
+         id="path312"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-66,-120)"
+         d="m 82,129 -2,-2 h -5 c -0.55,0 -1,0.45 -1,1 v 10 c 0,0.55 0.45,1 1,1 h 12 c 0.55,0 1,-0.45 1,-1 v -8 c 0,-0.55 -0.45,-1 -1,-1 h -5 z"
+         id="path314"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(140,48)"
+     id="g316">
+    <svg
+       width="28"
+       height="24"
+       id="svg318"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-258,-144)"
+         d="m 278,150 h -10.5 c -0.8325,0 -1.5,0.675 -1.5,1.5 v 9 c 0,0.825 0.6675,1.5 1.5,1.5 H 278 c 0.825,0 1.5,-0.675 1.5,-1.5 v -9 c 0,-0.825 -0.6675,-1.5 -1.5,-1.5 z m 0,10.5 H 267.5 V 153 H 278 v 7.5 z"
+         id="path320"
+         inkscape:connector-curvature="0"
+         style="fill:#010101" />
+      <path
+         transform="translate(-258,-144)"
+         d="m 262.97,147.07 h 18 v 18 h -18 z"
+         id="path322"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+    </svg>
+  </g>
+  <g
+     transform="translate(140,72)"
+     id="g324">
+    <svg
+       width="28"
+       height="24"
+       id="svg326"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(6,3.9)"
+         d="M 9,1 H 3.9954 C 3.45567,1 3,1.45078 3,2.0068 v 11.986 c 0,0.5569 0.44565,1.0068 0.9954,1.0068 h 8.0092 C 12.54433,14.9996 13,14.54882 13,13.9928 V 4.9996 l -4,-4 z m 3,4 H 9 V 2 l 3,3 z M 6,7 11,9.5 6,12 V 7 z"
+         id="path328"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(140,96)"
+     id="g330">
+    <svg
+       width="28"
+       height="24"
+       id="svg332"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g334"
+         style="stroke:#000000">
+        <path
+           transform="matrix(0.72907,0,0,0.72907,5.617,4.598)"
+           d="M 7.854,6.963 6.877,7.279 6.857,8.617 6.889,8.705 7.398,9.699 6.188,10.578 5.398,9.787 5.326,9.73 4.047,9.336 3.443,10.166 4.213,11.26 4.291,11.313 5.287,11.817 4.824,13.241 3.72,13.065 3.628,13.061 2.362,13.493 v 1.027 l 1.266,0.434 0.092,-0.004 1.104,-0.178 0.463,1.424 -0.996,0.506 -0.078,0.051 -0.77,1.094 0.604,0.83 1.279,-0.393 0.072,-0.059 0.789,-0.791 1.211,0.879 -0.51,0.996 -0.031,0.086 0.02,1.338 0.977,0.316 0.803,-1.068 0.025,-0.09 0.172,-1.104 h 1.498 l 0.172,1.104 0.025,0.09 0.803,1.068 0.977,-0.316 0.02,-1.338 -0.031,-0.086 -0.51,-0.996 1.211,-0.879 0.789,0.791 0.072,0.059 1.279,0.393 0.604,-0.83 -0.771,-1.094 -0.076,-0.051 -0.996,-0.506 0.461,-1.424 1.105,0.178 0.092,0.004 1.266,-0.434 v -1.027 l -1.266,-0.432 -0.092,0.004 -1.105,0.176 -0.461,-1.424 0.996,-0.504 0.076,-0.053 0.771,-1.094 L 15.159,9.336 13.88,9.731 13.808,9.788 13.019,10.579 11.808,9.7 12.318,8.706 12.349,8.618 12.329,7.28 11.352,6.964 10.549,8.034 10.524,8.122 10.352,9.227 H 8.854 L 8.682,8.121 8.656,8.03 7.854,6.963 m 1.748,3.398 a 3.621,3.645 0 0 1 3.621,3.645 3.621,3.645 0 0 1 -3.621,3.646 3.621,3.645 0 0 1 -3.619,-3.646 3.621,3.645 0 0 1 3.619,-3.645 z"
+           id="path336"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="matrix(0.72907,0,0,0.72907,5.227,3.617)"
+           d="M 14.885,1.563 14.178,1.957 14.365,3.24 14.396,3.279 15.14,4.04 14.553,5.03 13.529,4.736 13.479,4.729 12.262,5.172 12.25,5.98 13.455,6.459 13.506,6.453 14.537,6.189 15.1,7.191 14.332,7.932 14.301,7.971 14.08,9.248 14.771,9.662 15.787,8.859 15.807,8.811 16.1,7.787 17.242,7.803 17.502,8.834 17.52,8.883 18.514,9.715 19.219,9.32 19.03,8.04 19,7.998 18.258,7.234 18.844,6.25 19.869,6.541 19.92,6.551 21.14,6.105 21.15,5.297 19.943,4.818 19.893,4.824 18.861,5.088 18.301,4.086 19.07,3.346 19.1,3.307 19.322,2.029 18.627,1.615 17.609,2.418 17.59,2.467 17.303,3.49 16.16,3.475 15.896,2.443 15.879,2.395 14.885,1.563 z m 1.814,2.138 a 1.938,1.938 0 0 1 1.938,1.938 1.938,1.938 0 0 1 -1.938,1.937 1.938,1.938 0 0 1 -1.937,-1.937 1.938,1.938 0 0 1 1.937,-1.938 z"
+           id="path338"
+           inkscape:connector-curvature="0"
+           style="stroke-width:0.89899999" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(140,120)"
+     id="g340">
+    <svg
+       width="28"
+       height="24"
+       id="svg342"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g344"
+         style="fill:none">
+        <path
+           transform="translate(8,4)"
+           d="M 0,0 H 16 V 16 H 0 V 0 z"
+           id="path346"
+           inkscape:connector-curvature="0"
+           style="opacity:0.5" />
+        <path
+           transform="translate(8,4)"
+           d="M 6,14 H 3.5 C 2.5,14 2,13.5 2,12.5 v -9 C 2,2.5 2.5,2 3.5,2 h 9 C 14,2 14,3.4678 14,3.5 V 6 H 13 V 3 H 3 v 10 h 3 v 1 z m 9,-5 -3,2 3,3 -1,1 -3,-3 -2,3 -2,-8 8,2 z"
+           id="path348"
+           inkscape:connector-curvature="0"
+           style="fill:#000000" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(0,144)"
+     id="g350">
+    <svg
+       width="28"
+       height="24"
+       id="svg352"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-98,-120)"
+         d="m 110.5,127.5 h -1 l 2,-2 2,2 h -1 c 0,0 -0.0345,4.6379 -0.0345,4.0345 l 4.0345,-0.034 v -1 l 2,2 -2,2 v -1 l -4.0345,-0.034 0.0345,4.0346 h 1 l -2,2 -2,-2 h 1 l 0.0345,-4.0346 -4.0345,0.034 v 1 l -2,-2 2,-2 v 1 l 4.0345,0.034 z"
+         id="path354"
+         inkscape:connector-curvature="0"
+         style="stroke:#000000" />
+    </svg>
+  </g>
+  <g
+     transform="translate(28,144)"
+     id="g356">
+    <svg
+       width="28"
+       height="24"
+       id="svg358"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-320,0)"
+         d="m 333.6,15.2 h 1.6 V 8.8 h -1.6 v 6.4 z M 336,4 c -4.42,0 -8,3.58 -8,8 0,4.42 3.58,8 8,8 4.42,0 8,-3.58 8,-8 0,-4.42 -3.58,-8 -8,-8 z m 0,14.4 c -3.528,0 -6.4,-2.872 -6.4,-6.4 0,-3.528 2.872,-6.4 6.4,-6.4 3.528,0 6.4,2.872 6.4,6.4 0,3.528 -2.872,6.4 -6.4,6.4 z m 0.8,-3.2 h 1.6 V 8.8 h -1.6 v 6.4 z"
+         id="path360"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(56,144)"
+     id="g362">
+    <svg
+       width="28"
+       height="24"
+       id="svg364"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-32,-72)"
+         d="m 47,88 h -3 v -8 h 3 v 8 z"
+         id="path366"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-32,-72)"
+         d="m 53,88 h -3 v -8 h 3 v 8 z"
+         id="path368"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(84,144)"
+     id="g370">
+    <svg
+       width="28"
+       height="24"
+       id="svg372"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-256,0)"
+         d="m 275,15 h -2 V 9 h 2 z m -4,0 h -2 V 9 h 2 z m 4,-10 h -6 l -4,4 v 6 l 4,4 h 6 l 4,-4.12 V 9 z"
+         id="path374"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(112,144)"
+     id="g376">
+    <svg
+       width="28"
+       height="24"
+       id="svg378"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         font-weight="400"
+         id="g380"
+         style="font-weight:400;font-family:Sans">
+        <path
+           transform="translate(-289,-96)"
+           d="m 300,101 v 4.0001 1.0001 l 3.3434,0.53115 -0.0156,8.0468 -1.3278,0.42183 c 0.006,0.59278 0.43931,1.0114 1,1 h 8 c 0.57896,0.002 0.98177,-0.42708 1,-1 v -14 c -0.0102,-0.53477 -0.48177,-0.99739 -1,-1 h -10 c -0.53297,0.008 -0.99716,0.45677 -1,1 z m 1,0 h 10 v 14 h -8 l 0.71845,-0.42179 0.0937,-8.4218 -2.8122,-0.1561 v -0.99993 z"
+           overflow="visible"
+           style="text-indent:0;line-height:normal;text-transform:none;block-progression:tb;overflow:visible"
+           id="path382"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="translate(-289,-96)"
+           d="m 297,106 v 9 c 0.006,0.59278 0.43931,1.0114 1,1 h 5 c 0.57896,0.002 0.98177,-0.42708 1,-1 v -9 c -0.0102,-0.53477 -0.48177,-0.99739 -1,-1 h -5 c -0.53297,0.008 -0.99716,0.45677 -1,1 z m 1,1.0002 h 5 v 7 h -5 z"
+           overflow="visible"
+           style="text-indent:0;line-height:normal;text-transform:none;block-progression:tb;overflow:visible"
+           id="path384"
+           inkscape:connector-curvature="0" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(140,144)"
+     id="g386">
+    <svg
+       width="28"
+       height="24"
+       id="svg388"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-320,-48)"
+         d="m 328,60 c 0,4.42 3.58,8 8,8 4.42,0 8,-3.58 8,-8 0,-4.42 -3.58,-8 -8,-8 -4.42,0 -8,3.58 -8,8 z m 8,6.4 c -3.528,0 -6.4,-2.872 -6.4,-6.4 0,-3.528 2.872,-6.4 6.4,-6.4 3.528,0 6.4,2.872 6.4,6.4 0,3.528 -2.872,6.4 -6.4,6.4 z M 334.5067,63.4286 339.0781,60 334.5067,56.5714 v 6.8571 z"
+         id="path390"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(0,168)"
+     id="g392">
+    <svg
+       width="28"
+       height="24"
+       id="svg394"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-96,-48)"
+         d="m 108,60 10,-5 v 10"
+         id="path396"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(28,168)"
+     id="g398">
+    <svg
+       width="28"
+       height="24"
+       id="svg400"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-64,-48)"
+         d="M 86,60 76,55 v 10"
+         id="path402"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(56,168)"
+     id="g404">
+    <svg
+       width="28"
+       height="24"
+       id="svg406"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-256,-24)"
+         d="m 268.01,35.99 c 0.61,0.28 1.07,0.9 1.07,1.58 0.11,0.85 -0.05,1.72 0.12,2.57 0.27,0.54 1,0.28 1.43,0.55 0.49,0.24 0.48,1.01 -0.06,1.18 -0.56,0.22 -1.18,0.08 -1.74,-0.05 -0.71,-0.2 -1.41,-0.72 -1.5,-1.5 -0.18,-0.89 0.01,-1.8 -0.16,-2.68 -0.22,-0.64 -0.94,-0.9 -1.57,-0.93 -0.58,-0.1 -0.83,-0.94 -0.35,-1.3 0.51,-0.35 1.26,-0.14 1.69,-0.66 0.44,-0.48 0.29,-1.18 0.32,-1.78 0,-0.81 -0.02,-1.77 0.65,-2.34 0.66,-0.54 1.58,-0.71 2.41,-0.63 0.63,0 0.98,0.87 0.4,1.22 -0.44,0.37 -1.2,0.06 -1.51,0.65 -0.14,0.56 -0.05,1.15 -0.07,1.73 -0.01,0.75 -0.05,1.64 -0.72,2.13 -0.12,0.1 -0.26,0.19 -0.4,0.26"
+         id="path408"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-256,-24)"
+         d="m 276.98,35.99 c -0.67,-0.3 -1.08,-1.02 -1.08,-1.75 -0.07,-0.76 0.03,-1.52 -0.06,-2.28 -0.24,-0.58 -0.98,-0.4 -1.46,-0.59 -0.59,-0.24 -0.48,-1.18 0.14,-1.31 0.73,-0.15 1.52,-0.01 2.18,0.32 0.56,0.28 0.95,0.86 0.99,1.48 0.13,0.83 -0.03,1.68 0.13,2.5 0.2,0.68 0.94,0.83 1.54,0.9 0.56,0.07 0.86,0.8 0.46,1.21 -0.44,0.46 -1.2,0.2 -1.65,0.66 -0.51,0.46 -0.4,1.21 -0.4,1.83 -0.03,0.78 0.06,1.69 -0.52,2.3 -0.74,0.65 -1.8,0.86 -2.75,0.68 -0.52,-0.16 -0.69,-1.01 -0.15,-1.25 0.44,-0.23 1.02,-0.08 1.41,-0.45 0.26,-0.45 0.09,-0.98 0.14,-1.47 0.01,-0.76 -0.07,-1.63 0.43,-2.26 0.18,-0.21 0.42,-0.37 0.66,-0.51"
+         id="path410"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(84,168)"
+     id="g412">
+    <svg
+       width="28"
+       height="24"
+       id="svg414"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g416">
+        <path
+           d="M 0,0 H 24 V 24 H 0 z"
+           id="path418"
+           inkscape:connector-curvature="0"
+           style="fill:none" />
+        <path
+           d="m 16,6 c -3.31,0 -6,2.69 -6,6 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 h -2 c 0,2.2091 -1.7909,4 -4,4 -2.2091,0 -4,-1.7909 -4,-4 0,-2.2091 1.7909,-4 4,-4 1.2756,0 2.3926,0.60127 3.125,1.5312 h 2.3438 C 20.52659,7.4496 18.4308,6 16,6 z"
+           id="path420"
+           inkscape:connector-curvature="0" />
+        <path
+           d="M 21.091,6.88 V 9.9718 H 17.9992 z"
+           id="path422"
+           inkscape:connector-curvature="0"
+           style="stroke:#000000;stroke-width:1.06799996" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(112,168)"
+     id="g424">
+    <svg
+       width="28"
+       height="24"
+       id="svg426"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(8,4)"
+         d="M 2.5858,13.891 C 0.9959,12.4291 0,10.3315 0,8.0002 c 0,-4.42 3.58,-8 8,-8 4.42,0 8,3.58 8,8 0,4.42 -3.58,8 -8,8 v -1.6 c 3.528,0 6.4,-2.872 6.4,-6.4 0,-3.528 -2.872,-6.4 -6.4,-6.4 -3.528,0 -6.4,2.872 -6.4,6.4 0,1.9357 0.86461,3.674 2.2278,4.8487 l 1.6925,-1.4201 0.015145,4.463 -4.3925,-0.7899 1.443,-1.2108 z M 6.5066,11.4287 11.078,8.0001 6.5066,4.5715 v 6.8571 z"
+         id="path428"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(140,168)"
+     id="g430">
+    <svg
+       width="28"
+       height="24"
+       id="svg432"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(0,-72)"
+         d="M 23,84 15,79 V 89"
+         id="path434"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-72)"
+         d="M 13,89 H 10 V 79 h 3 v 10 z"
+         id="path436"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(168,0)"
+     id="g438">
+    <svg
+       width="28"
+       height="24"
+       id="svg440"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-160,-120)"
+         d="m 169.2,130.15 c 0.0551,-0.1128 0.15339,-0.22 0.2313,-0.3064 0.54584,-0.6074 1.3889,-1.1974 3.0053,-1.5702 v -2.1715 c -1.2931,0.2523 -2.3146,0.6686 -3.304,1.5597 -0.33248,0.3832 -0.50543,0.6247 -0.514,1.1665 -0.007,0.443 0.17732,0.8863 0.58141,1.3219 z m 6.6309,3.1292 c -1.6164,-0.024 -3.1091,-0.2558 -4.6228,-0.764 -2.6938,-0.9037 -3.0286,-2.1697 -3.1703,-2.5931 -0.0958,1.6897 0.028,2.9573 0.0346,3.0648 0.092,1.5004 1.2918,2.6742 2.1575,3.1151 1.7796,0.9067 3.6614,1.3756 5.601,1.4151 v 2.4842 l 3.251,-4.6483 -3.251,-4.6486 v 2.5748 z m -0.32327,-5.2959 c 1.6164,0.01 3.4529,0.3384 5.2454,1.1131 0.73528,0.3177 1.3275,0.7904 1.8082,1.3048 0.33152,-0.1523 0.80672,-0.7308 0.74126,-1.2923 -0.16163,-1.3879 -1.6264,-2.1912 -1.8801,-2.3045 -1.7704,-0.7908 -3.9751,-1.0356 -5.9147,-1.0589 v -1.7442 l -2.0132,2.8787 2.0132,2.8783 v -1.775 z m 8.4236,1.8658 c -0.0824,0.6478 -0.82676,2.0349 -3.8978,2.9138 v 4.5247 c 1.1314,-0.3677 2.465,-1.2956 3.1787,-2.1988 0.2911,-0.3677 0.46906,-0.875 0.57736,-1.242 0.33216,-1.1229 0.18604,-3.3136 0.14175,-3.9977 z"
+         id="path442"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(168,24)"
+     id="g444">
+    <svg
+       width="28"
+       height="24"
+       id="svg446"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(8,4)"
+         d="m 10.624,2.47 c 1.9155,0.90417 3.2862,2.7533 3.4971,4.9467 h 0.87866 C 14.70102,3.8234 11.68426,1 7.99976,1 L 7.61315,1.0175 9.84495,3.24 10.62403,2.47 z M 6.9629,2.02083 c -0.34561,-0.34417 -0.90209,-0.34417 -1.2418,0 l -3.7255,3.71 c -0.34561,0.34417 -0.34561,0.89833 0,1.2367 l 7.041,7.0117 c 0.34561,0.34417 0.90209,0.34417 1.2418,0 l 3.7255,-3.71 c 0.34561,-0.34417 0.34561,-0.89833 0,-1.2367 l -7.041,-7.0117 z m 2.6946,11.34 -7.041,-7.0117 3.7255,-3.71 7.041,7.0117 -3.7255,3.71 z M 5.3755,13.53 C 3.46,12.63167 2.0893,10.7767 1.8784,8.5833 H 0.99974 C 1.29848,12.1766 4.31524,15 7.99974,15 L 8.38635,14.9825 6.15455,12.76 5.37547,13.53 z"
+         id="path448"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(168,48)"
+     id="g450">
+    <svg
+       width="28"
+       height="24"
+       id="svg452"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-288,-72)"
+         d="m 293.96,74.013 h 20 v 20 h -20 z"
+         id="path454"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-288,-72)"
+         d="m 297,77 h 18 v 18 h -18 z"
+         id="path456"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-288,-72)"
+         d="m 295.25,75.25 h 20 v 20 h -20 z"
+         id="path458"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-288,-72)"
+         d="m 293.12,73.125 h 20 v 20 h -20 z"
+         id="path460"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-288,-72)"
+         d="m 288,72 h 24 v 24 h -24 z"
+         id="path462"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-288,-72)"
+         d="m 309.35,84.686 c 0.0288,-0.224 0.0504,-0.448 0.0504,-0.686 0,-0.238 -0.0216,-0.462 -0.0504,-0.686 l 1.5184,-1.155 c 0.13673,-0.105 0.17272,-0.294 0.0863,-0.448 l -1.4393,-2.422 c -0.0863,-0.154 -0.28065,-0.21 -0.43897,-0.154 l -1.7919,0.7 c -0.37422,-0.28 -0.77722,-0.511 -1.2162,-0.686 l -0.27341,-1.855 C 305.77334,77.126 305.62223,77 305.44232,77 h -2.8785 c -0.17992,0 -0.33104,0.126 -0.35263,0.294 l -0.27346,1.855 c -0.43898,0.175 -0.84198,0.413 -1.2162,0.686 l -1.7919,-0.7 c -0.16551,-0.063 -0.35262,0 -0.43898,0.154 l -1.4393,2.422 c -0.0935,0.154 -0.0504,0.343 0.0863,0.448 l 1.5184,1.155 c -0.0287,0.224 -0.0504,0.455 -0.0504,0.686 0,0.231 0.0216,0.462 0.0504,0.686 l -1.5184,1.155 c -0.13673,0.105 -0.17271,0.294 -0.0863,0.448 l 1.4393,2.422 c 0.0863,0.154 0.28067,0.21 0.43898,0.154 l 1.7919,-0.7 c 0.37421,0.28 0.77721,0.511 1.2162,0.686 l 0.27346,1.855 c 0.0216,0.168 0.17271,0.294 0.35263,0.294 h 2.8785 c 0.17991,0 0.33103,-0.126 0.35263,-0.294 l 0.27345,-1.855 c 0.43898,-0.175 0.84198,-0.413 1.2162,-0.686 l 1.7919,0.7 c 0.16552,0.063 0.35263,0 0.43898,-0.154 l 1.4393,-2.422 c 0.0863,-0.154 0.0504,-0.343 -0.0863,-0.448 l -1.5184,-1.155 z m -5.3469,1.764 c -1.3889,0 -2.5187,-1.099 -2.5187,-2.45 0,-1.351 1.1298,-2.45 2.5187,-2.45 1.3889,0 2.5187,1.099 2.5187,2.45 0,1.351 -1.1298,2.45 -2.5187,2.45 z"
+         id="path464"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(168,72)"
+     id="g466">
+    <svg
+       width="28"
+       height="24"
+       id="svg468"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(0,-1,1,0,-136,251)"
+         d="m 232.5,150.5 h 14 v 12 h -14 z"
+         id="path470"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000" />
+      <path
+         transform="matrix(0,-1,1,0,-136,251)"
+         d="m 244,156.5 -5,-3.25 v 6.5"
+         id="path472"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0,-1,1,0,-136,251)"
+         d="m 236,150 h 1 v 13 h -1 z"
+         id="path474"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(168,96)"
+     id="g476">
+    <svg
+       width="28"
+       height="24"
+       id="svg478"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-160,-72)"
+         d="m 168.5,78.5 h 14 v 12 h -14 z"
+         id="path480"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000" />
+      <path
+         transform="translate(-160,-72)"
+         d="m 180,84.5 -5,-3.25 v 6.5"
+         id="path482"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-160,-72)"
+         d="m 172,78 h 1 v 13 h -1 z"
+         id="path484"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(168,120)"
+     id="g486">
+    <svg
+       width="28"
+       height="24"
+       id="svg488"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(-1,0,0,1,-192,-96)"
+         d="m -214.5,102.5 h 14 v 12 h -14 z"
+         id="path490"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000" />
+      <path
+         transform="translate(-192,-96)"
+         d="m 203,108.5 5,-3.25 v 6.5"
+         id="path492"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(-1,0,0,1,-192,-96)"
+         d="m -211,102 h 1 v 13 h -1 z"
+         id="path494"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(168,144)"
+     id="g496">
+    <svg
+       width="28"
+       height="24"
+       id="svg498"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(0,1,1,0,-88,219)"
+         d="m -214.5,102.5 h 14 v 12 h -14 z"
+         id="path500"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000" />
+      <path
+         transform="matrix(0,-1,1,0,-88,219)"
+         d="m 203,108.5 5,-3.25 v 6.5"
+         id="path502"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0,1,1,0,-88,219)"
+         d="m -211,102 h 1 v 13 h -1 z"
+         id="path504"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(168,168)"
+     id="g506">
+    <svg
+       width="28"
+       height="24"
+       id="svg508"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-288,0)"
+         d="m 298,12 c 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 0,-3.31 -2.69,-6 -6,-6 -3.31,0 -6,2.69 -6,6"
+         id="path510"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(0,192)"
+     id="g512">
+    <svg
+       width="28"
+       height="24"
+       id="svg514"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-64,-72)"
+         d="m 78.5,89 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2"
+         id="path516"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-64,-72)"
+         d="m 79,78 v 4 h -3 l 4.5,4 4.5,-4 h -3 v -4 h -3 z"
+         id="path518"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(28,192)"
+     id="g520">
+    <svg
+       width="28"
+       height="24"
+       id="svg522"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-96,-72)"
+         d="m 110.5,89 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2"
+         id="path524"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-96,-72)"
+         d="m 112.5,78 -4.5,4 h 3 v 4 h 3 v -4 h 3 l -4.5,-4 z"
+         id="path526"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(56,192)"
+     id="g528">
+    <svg
+       width="28"
+       height="24"
+       id="svg530"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-128,-72)"
+         d="m 142,86.5 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2"
+         id="path532"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-128,-72)"
+         d="m 137.25,87.03 c 2.55,-8.43 11.4,-8.73 13.94,0"
+         id="path534"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000;stroke-width:2.5" />
+      <path
+         transform="translate(-128,-72)"
+         d="m 151.68,89 -4.54,-2.76 6.68,-2.1"
+         id="path536"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(84,192)"
+     id="g538">
+    <svg
+       width="28"
+       height="24"
+       id="svg540"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-288,-24)"
+         d="m 295,36 c 0,4.97 4.03,9 9,9 4.97,0 9,-4.03 9,-9 0,-4.97 -4.03,-9 -9,-9 -4.97,0 -9,4.03 -9,9"
+         id="path542"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite60_a)" />
+      <path
+         transform="translate(-288,-24)"
+         d="m 298,36 c 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 0,-3.31 -2.69,-6 -6,-6 -3.31,0 -6,2.69 -6,6"
+         id="path544"
+         inkscape:connector-curvature="0" />
+      <defs
+         id="defs546">
+        <radialGradient
+           id="sprite60_b"
+           cx="0"
+           cy="0"
+           r="1"
+           gradientTransform="matrix(18,0,0,-18,680,341)"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             offset="0"
+             id="stop549" />
+          <stop
+             stop-opacity="0"
+             offset="1"
+             id="stop551" />
+        </radialGradient>
+        <radialGradient
+           id="sprite60_a"
+           cx="0"
+           cy="0"
+           r="1"
+           gradientTransform="matrix(9,0,0,9,304,36)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite60_b" />
+      </defs>
+    </svg>
+  </g>
+  <g
+     transform="translate(112,192)"
+     id="g554">
+    <svg
+       width="28"
+       height="24"
+       id="svg556"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g558">
+        <path
+           transform="translate(7,3)"
+           d="M 0,0 H 18 V 18 H 0 z"
+           id="path560"
+           inkscape:connector-curvature="0"
+           style="fill:none" />
+        <path
+           transform="translate(7,3)"
+           d="M 15.25,8 H 16 V 6.125 5 H 5 V 6.125 8 h 0.75 c 0,-0.82843 0.67157,-1.5 1.5,-1.5 h 2.5 v 7.25 c 0,0.82843 -0.67157,1.5 -1.5,1.5 V 16 h 1.875 0.75 1.875 v -0.75 c -0.82843,0 -1.5,-0.67157 -1.5,-1.5 V 6.5 h 2.5 c 0.82843,0 1.5,0.67157 1.5,1.5 z"
+           id="path562"
+           inkscape:connector-curvature="0"
+           style="fill-opacity:0.36000001" />
+        <path
+           transform="translate(7,3)"
+           d="M 12.25,5 H 13 V 3.125 2 H 2 V 3.125 5 h 0.75 c 0,-0.82843 0.67157,-1.5 1.5,-1.5 h 2.5 v 7.25 c 0,0.82843 -0.67157,1.5 -1.5,1.5 V 13 h 1.875 0.75 1.875 v -0.75 c -0.82843,0 -1.5,-0.67157 -1.5,-1.5 V 3.5 h 2.5 c 0.82843,0 1.5,0.67157 1.5,1.5 z"
+           id="path564"
+           inkscape:connector-curvature="0" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(140,192)"
+     id="g566">
+    <svg
+       width="28"
+       height="24"
+       id="svg568"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-128,-24)"
+         d="m 139.5,33 h 9 L 147,43 h -6"
+         id="path570"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-128,-24)"
+         d="m 147.5,30 h -2 v -1 h -3 v 1 h -2 c -0.55,0 -1,0.48 -1,1 v 1 h 1 7 1 v -1 c 0,-0.52 -0.45,-1 -1,-1"
+         id="path572"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(168,192)"
+     id="g574">
+    <svg
+       width="28"
+       height="24"
+       id="svg576"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(0,-48)"
+         d="M 10,57 H 8 v 9 h 11 v -2 h -9 z"
+         id="path578"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(0,-48)"
+         d="m 13,56 h 7 v 5 h -7 z m -2,-2 v 9 h 11 v -9 z"
+         id="path580"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(196,0)"
+     id="g582">
+    <svg
+       width="28"
+       height="24"
+       id="svg584"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-96,0)"
+         d="m 112,6.6909 c -3.6364,0 -6.7418,2.2618 -8,5.4545 1.2582,3.1927 4.3636,5.4545 8,5.4545 3.6364,0 6.7418,-2.2618 8,-5.4545 -1.2582,-3.1927 -4.3636,-5.4545 -8,-5.4545 z m 0,9.0909 c -2.0073,0 -3.6364,-1.6291 -3.6364,-3.6364 0,-2.0073 1.6291,-3.6364 3.6364,-3.6364 2.0073,0 3.6364,1.6291 3.6364,3.6364 0,2.0073 -1.6291,3.6364 -3.6364,3.6364 z m 0,-5.8182 c -1.2073,0 -2.1818,0.97455 -2.1818,2.1818 0,1.2073 0.97455,2.1818 2.1818,2.1818 1.2073,0 2.1818,-0.97455 2.1818,-2.1818 0,-1.2073 -0.97455,-2.1818 -2.1818,-2.1818 z"
+         id="path586"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(196,24)"
+     id="g588">
+    <svg
+       width="28"
+       height="24"
+       id="svg590"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-128,-48)"
+         d="m 153,57 h -11 v -2 h 11 v 2 z"
+         id="path592"
+         inkscape:connector-curvature="0"
+         style="opacity:0.2" />
+      <path
+         transform="translate(-128,-48)"
+         d="m 142,57 h -6 v -2 h 6 v 2 z"
+         id="path594"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-128,-48)"
+         d="m 145,60 h -6 v -2 h 6 v 2 z"
+         id="path596"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-128,-48)"
+         d="m 150,63 h -6 v -2 h 6 v 2 z"
+         id="path598"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="translate(-128,-48)"
+         d="m 152,66 h -6 v -2 h 6 v 2 z"
+         id="path600"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+</svg>
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/mediumIcons.svg b/third_party/WebKit/Source/devtools/front_end/Images/src/mediumIcons.svg
new file mode 100644
index 0000000..6e8d99e
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/mediumIcons.svg
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64"
+   height="64"
+   id="svg4775"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="mediumIcons.svg">
+  <metadata
+     id="metadata4917">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs4915" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1352"
+     inkscape:window-height="821"
+     id="namedview4913"
+     showgrid="true"
+     inkscape:zoom="5.2149125"
+     inkscape:cx="48.203449"
+     inkscape:cy="22.945132"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg4775">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4919"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       spacingx="16px"
+       spacingy="16px" />
+  </sodipodi:namedview>
+  <g
+     id="g4777">
+    <svg
+       width="16"
+       height="16"
+       id="svg4779"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         d="m 3,4 h 10 v 9.008 C 13,14.1082 12.11257,15 11.0004,15 H 4.9996 C 3.8952,15 3,14.09982 3,13.008 V 4 z M 2,2 H 14 V 3 H 2 V 2 z M 5,1 h 6 V 2 H 5 V 1 z"
+         id="path4781"
+         inkscape:connector-curvature="0"
+         style="fill:#212121" />
+    </svg>
+  </g>
+  <g
+     transform="translate(16,0)"
+     id="g4783">
+    <svg
+       width="16"
+       height="16"
+       id="svg4785"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         d="M 13.526,6.25 H 12.0523 V 5.5 c 0,-0.414 -0.33011,-0.75 -0.73684,-0.75 H 9.84176 V 4 c 0,-0.414 -0.33011,-0.75 -0.73684,-0.75 H 8.36808 V 1.75 C 8.36808,1.423 8.16029,1.153 7.87366,1.0495 7.81987,1.021 7.74913,1 7.63124,1 c -3.6628,0 -6.6316,3.0218 -6.6316,6.75 0,3.7275 2.9687,6.75 6.6316,6.75 3.6629,0 6.6316,-3.0225 6.6316,-6.75 V 7 c 0,-0.414 -0.3301,-0.75 -0.73684,-0.75 z M 3.5786,8.5 C 2.96784,8.5 2.4733,7.99667 2.4733,7.375 2.4733,6.75333 2.9678,6.25 3.5786,6.25 4.1894,6.25 4.6839,6.75333 4.6839,7.375 4.6839,7.99667 4.1894,8.5 3.5786,8.5 z M 4.6839,4.375 c 0,-0.62175 0.49516,-1.125 1.1053,-1.125 0.61084,0 1.1053,0.50325 1.1053,1.125 C 6.8945,4.996 6.40008,5.5 5.7892,5.5 5.17909,5.5 4.6839,4.996 4.6839,4.375 z M 6.8944,13 c -0.61059,0 -1.1053,-0.50334 -1.1053,-1.1246 0,-0.62129 0.49467,-1.1254 1.1053,-1.1254 0.61063,0 1.1053,0.50409 1.1053,1.1254 C 7.9997,12.49668 7.50503,13 6.8944,13 z M 7.26282,9.25 C 6.65271,9.25 6.15752,8.746 6.15752,8.125 6.15752,7.504 6.65268,7 7.26282,7 c 0.61014,0 1.1053,0.504 1.1053,1.125 0,0.621 -0.49516,1.125 -1.1053,1.125 z m 3.6842,1.5 c -0.6101,0 -1.1053,-0.504 -1.1053,-1.125 0,-0.621 0.49516,-1.125 1.1053,-1.125 0.61011,0 1.1053,0.504 1.1053,1.125 0,0.621 -0.49516,1.125 -1.1053,1.125 z"
+         id="path4787"
+         inkscape:connector-curvature="0"
+         style="fill:#212121" />
+    </svg>
+  </g>
+  <g
+     transform="translate(32,0)"
+     id="g4789">
+    <svg
+       width="16"
+       height="16"
+       id="svg4791"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         d="M 8,6 C 11.3137,6 14,5.10457 14,4 14,2.89543 11.3137,2 8,2 4.6863,2 2,2.89543 2,4 2,5.10457 4.6863,6 8,6 z m -6,7 c 0,1.1046 2.6863,2 6,2 3.3137,0 6,-0.89543 6,-2 v -2 c 0,1.1046 -2.6863,2 -6,2 -3.3137,0 -6,-0.89543 -6,-2 v 2 z m 0,-3 c 0,1.1046 2.6863,2 6,2 3.3137,0 6,-0.89543 6,-2 V 8 C 14,9.1046 11.3137,10 8,10 4.6863,10 2,9.10457 2,8 v 2 z M 2,7 c 0,1.1046 2.6863,2 6,2 3.3137,0 6,-0.89543 6,-2 V 5 C 14,6.1046 11.3137,7 8,7 4.6863,7 2,6.10457 2,5 v 2 z"
+         id="path4793"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(48,0)"
+     id="g4795">
+    <svg
+       width="16"
+       height="16"
+       id="svg4797"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g4799">
+        <g
+           id="g4801"
+           style="fill:none">
+          <path
+             d="M 0,0 H 16 V 16 H 0 z"
+             id="path4803"
+             inkscape:connector-curvature="0" />
+          <path
+             transform="translate(3,1)"
+             d="M 6,0 H 0.9954 C 0.45567,0 0,0.45078 0,1.0068 v 11.986 c 0,0.5569 0.44565,1.0068 0.9954,1.0068 H 9.0046 C 9.54433,13.9996 10,13.54882 10,12.9928 V 3.9996 l -4,-4 z M 9.29,4 H 6 V 0.71 L 9.29,4 z"
+             id="path4805"
+             inkscape:connector-curvature="0"
+             style="fill:#000000" />
+        </g>
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(0,16)"
+     id="g4807">
+    <svg
+       width="16"
+       height="16"
+       id="svg4809"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         d="M 6.5,3.2289 V 1 h 3 v 2.2289 c 0.70763,0.22225 1.3475,0.59759 1.8807,1.0872 l 1.9315,-1.1151 1.5,2.5981 -1.9305,1.1146 c 0.07749,0.34976 0.11835,0.71329 0.11835,1.0864 0,0.37311 -0.04086,0.73661 -0.11835,1.0864 l 1.9305,1.1146 -1.5,2.5981 -1.9315,-1.1151 C 10.84746,12.17371 10.2076,12.54904 9.5,12.7713 v 2.2289 h -3 V 12.7713 C 5.79237,12.54905 5.1525,12.17371 4.6193,11.6841 l -1.9315,1.1151 -1.5,-2.5981 1.9305,-1.1146 C 3.04081,8.73674 2.99995,8.37321 2.99995,8.0001 2.99995,7.62699 3.04081,7.26349 3.1183,6.9137 L 1.1878,5.7991 2.6878,3.201 4.6193,4.3161 C 5.15253,3.82649 5.7924,3.45116 6.5,3.2289 z M 8,10.5 C 9.3807,10.5 10.5,9.3807 10.5,8 10.5,6.6193 9.3807,5.5 8,5.5 6.6193,5.5 5.5,6.6193 5.5,8 c 0,1.3807 1.1193,2.5 2.5,2.5 z"
+         id="path4811"
+         inkscape:connector-curvature="0"
+         style="fill:#212121" />
+    </svg>
+  </g>
+  <g
+     transform="translate(16,16)"
+     id="g4813">
+    <svg
+       width="16"
+       height="16"
+       id="svg4815"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         d="M 2,3.999 C 2,3.44729 2.45098,3.00004 2.99078,3.00004 h 5.0092 v 3 h -6 v -2.001 z M 2,11 h 6 v 3 H 2.9908 C 2.44361,14 2.00002,13.55734 2.00002,13.00104 v -2.001 z M 2,7 h 6 v 3 H 2 V 7 z M 9,3 h 5.0092 c 0.54719,0 0.99078,0.44266 0.99078,0.99896 v 2.001 h -6 v -3 z m 0,8 h 6 v 2.001 c 0,0.55171 -0.45098,0.99896 -0.99078,0.99896 h -5.0092 v -3 z M 9,7 h 6 v 3 H 9 V 7 z"
+         id="path4817"
+         inkscape:connector-curvature="0"
+         style="fill:#212121" />
+    </svg>
+  </g>
+  <g
+     transform="translate(34,18)"
+     id="g4819">
+    <svg
+       width="11"
+       height="11"
+       id="svg4821"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(1.1,0,0,1.1,-3.3,-3.3)"
+         d="m 8,13 c 2.7614,0 5,-2.2386 5,-5 C 13,5.2386 10.7614,3 8,3 5.2386,3 3,5.2386 3,8 c 0,2.7614 2.2386,5 5,5 z M 8,11 V 9 H 5 V 7 H 8 V 5 l 3,3 -3,3 z"
+         id="path4823"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(50,17)"
+     id="g4825">
+    <svg
+       width="12"
+       height="14"
+       id="svg4827"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         transform="translate(-76,-24)"
+         id="g4829">
+        <circle
+           transform="matrix(1.2,0,0,1.2,72.4,21.2)"
+           cx="10.5"
+           cy="11.5"
+           r="2.5"
+           id="circle4831"
+           d="M 13,11.5 C 13,12.880712 11.880712,14 10.5,14 9.1192881,14 8,12.880712 8,11.5 8,10.119288 9.1192881,9 10.5,9 11.880712,9 13,10.119288 13,11.5 z"
+           sodipodi:cx="10.5"
+           sodipodi:cy="11.5"
+           sodipodi:rx="2.5"
+           sodipodi:ry="2.5"
+           style="fill:#009802" />
+        <path
+           d="m 78,25 c -0.54399,0 -1,0.45026 -1,1 v 8 c 0,0.53973 0.44936,1 1,1 h 3.0312 c -0.02335,-0.1633 -0.03125,-0.33024 -0.03125,-0.5 0,-0.16976 0.0079,-0.3367 0.03125,-0.5 H 78 v -8 h 3 v 3 h 3 v 1.5 c 0.1633,-0.02335 0.33024,0 0.5,0 0.16976,0 0.3367,-0.02335 0.5,0 V 28 l -3,-3 z m 4,1 2,2 h -2 z"
+           id="path4833"
+           inkscape:connector-curvature="0" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(2,33)"
+     id="g4835">
+    <svg
+       width="12"
+       height="14"
+       id="svg4837"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-65.625,-24.5)"
+         d="m 71.625,25.5 h -4.003 c -0.54399,0 -0.99703,0.44566 -0.99703,0.9954 v 8.0092 c 0,0.53973 0.44639,0.9954 0.99703,0.9954 h 6.0059 c 0.54399,0 0.99703,-0.44566 0.99703,-0.9954 V 28.5 l -3,-3 z m 0,1 2,2 h -2 v -2 z m -4,0 h 3 v 3 h 3 v 5 h -6 v -8 z"
+         id="path4839"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(17,33)"
+     id="g4841">
+    <svg
+       width="13"
+       height="13"
+       id="svg4843"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-160,-96)"
+         d="m 160,102.5 c 0,3.59 2.91,6.5 6.5,6.5 3.59,0 6.5,-2.91 6.5,-6.5 0,-3.59 -2.91,-6.5 -6.5,-6.5 -3.59,0 -6.5,2.91 -6.5,6.5"
+         id="path4845"
+         inkscape:connector-curvature="0"
+         style="fill:#9f9f9f" />
+      <path
+         transform="translate(-160,-96)"
+         d="m 170,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4847"
+         inkscape:connector-curvature="0"
+         style="fill-opacity:0.36000001" />
+      <path
+         transform="translate(-160,-96)"
+         d="M 170,99.93 169.07,99 166.5,101.57 163.93,99 163,99.93 l 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4849"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff" />
+    </svg>
+  </g>
+  <g
+     transform="translate(33,33)"
+     id="g4851">
+    <svg
+       width="13"
+       height="13"
+       id="svg4853"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-143,-96)"
+         d="m 143,102.5 c 0,3.59 2.91,6.5 6.5,6.5 3.59,0 6.5,-2.91 6.5,-6.5 0,-3.59 -2.91,-6.5 -6.5,-6.5 -3.59,0 -6.5,2.91 -6.5,6.5"
+         id="path4855"
+         inkscape:connector-curvature="0"
+         style="fill:#bebebe" />
+      <path
+         transform="translate(-143,-96)"
+         d="m 153,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4857"
+         inkscape:connector-curvature="0"
+         style="fill-opacity:0.37000002" />
+      <path
+         transform="translate(-143,-96)"
+         d="M 153,99.93 152.07,99 149.5,101.57 146.93,99 146,99.93 l 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4859"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff" />
+    </svg>
+  </g>
+  <g
+     transform="translate(49,33)"
+     id="g4861">
+    <svg
+       width="14"
+       height="14"
+       id="svg4863"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-111,-96)"
+         d="m 118,96 c -3.87,0 -7,3.13 -7,7 0,3.87 3.13,7 7,7 3.87,0 7,-3.13 7,-7 0,-3.87 -3.13,-7 -7,-7"
+         id="path4865"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite12_a)" />
+      <path
+         transform="translate(-111,-96)"
+         d="m 111.5,103 c 0,3.59 2.91,6.5 6.5,6.5 3.59,0 6.5,-2.91 6.5,-6.5 0,-3.59 -2.91,-6.5 -6.5,-6.5 -3.59,0 -6.5,2.91 -6.5,6.5"
+         id="path4867"
+         inkscape:connector-curvature="0"
+         style="fill:#f27d82" />
+      <path
+         transform="translate(-111,-96)"
+         d="m 121.5,100.93 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4869"
+         inkscape:connector-curvature="0"
+         style="fill-opacity:0.36000001" />
+      <path
+         transform="translate(-111,-96)"
+         d="m 121.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4871"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff" />
+      <defs
+         id="defs4873">
+        <linearGradient
+           id="sprite12_r">
+          <stop
+             stop-color="#d7687d"
+             offset="0"
+             id="stop4876" />
+          <stop
+             stop-color="#b21402"
+             offset="1"
+             id="stop4878" />
+        </linearGradient>
+        <linearGradient
+           id="sprite12_a"
+           x2="24"
+           gradientTransform="matrix(0,-0.58333,-0.58333,0,118,110)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite12_r" />
+      </defs>
+    </svg>
+  </g>
+  <g
+     transform="translate(1,49)"
+     id="g4881">
+    <svg
+       width="14"
+       height="14"
+       id="svg4883"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-96,-96)"
+         d="m 103,110 c 3.87,0 7,-3.13 7,-7 0,-3.87 -3.13,-7 -7,-7 -3.87,0 -7,3.13 -7,7 0,3.87 3.13,7 7,7"
+         id="path4885"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite13_a)" />
+      <path
+         transform="translate(-96,-96)"
+         d="m 103,96.5 c -3.59,0 -6.5,2.91 -6.5,6.5 0,3.59 2.91,6.5 6.5,6.5 3.59,0 6.5,-2.91 6.5,-6.5 0,-3.59 -2.91,-6.5 -6.5,-6.5"
+         id="path4887"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite13_b)" />
+      <path
+         transform="translate(-96,-96)"
+         d="m 106.5,100.93 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4889"
+         inkscape:connector-curvature="0"
+         style="fill:#993c35" />
+      <path
+         transform="translate(-96,-96)"
+         d="m 106.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4891"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff" />
+      <defs
+         id="defs4893">
+        <linearGradient
+           id="sprite13_b"
+           x1="96.5"
+           x2="109.5"
+           y1="103"
+           y2="103"
+           gradientTransform="matrix(0,1,-1,0,206,0)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite13_q" />
+        <linearGradient
+           id="sprite13_q">
+          <stop
+             stop-color="#e59290"
+             offset="0"
+             id="stop4897" />
+          <stop
+             stop-color="#e99890"
+             offset="1"
+             id="stop4899" />
+        </linearGradient>
+        <linearGradient
+           id="sprite13_a"
+           x1="113"
+           x2="127"
+           y1="104"
+           y2="104"
+           gradientTransform="matrix(0,1,-1,0,207,-17)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite13_r" />
+        <linearGradient
+           id="sprite13_r">
+          <stop
+             stop-color="#c0544f"
+             offset="0"
+             id="stop4903" />
+          <stop
+             stop-color="#d08481"
+             offset="1"
+             id="stop4905" />
+        </linearGradient>
+      </defs>
+    </svg>
+  </g>
+  <g
+     transform="translate(18,50)"
+     id="g4907">
+    <svg
+       width="12"
+       height="12"
+       id="svg4909"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-234,-30)"
+         d="m 242.27,38.92 c -0.75073,0.56132 -1.6826,0.89372 -2.6921,0.89372 -2.4853,0 -4.5,-2.0147 -4.5,-4.5 0,-2.4853 2.0147,-4.5 4.5,-4.5 2.4853,0 4.5,2.0147 4.5,4.5 0,1.1154 -0.40579,2.136 -1.0778,2.9222 l 2.3456,2.3456 -0.70711,0.70711 z m -2.6921,-0.10628 c 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 z"
+         id="path4911"
+         inkscape:connector-curvature="0"
+         style="fill:#5b5b5b" />
+    </svg>
+  </g>
+</svg>
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes b/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
index e7f5a8d0..28b1eae 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
@@ -1,11 +1,11 @@
 {
     "securityIcons.svg": "27676f7c1f1542659c7c49a8052259dc",
-    "resourceGlyphs.svg": "ae5287ef4b10714c8858b5384c348b6a",
+    "largeIcons.svg": "08de0833433a45e705d88d1c9d9b145a",
     "breakpointConditional.svg": "4cf90210b2af2ed84db2f60b07bcde28",
     "checkboxCheckmark.svg": "f039bf85cee42ad5c30ca3bfdce7912a",
     "errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45",
-    "smallIcons.svg": "dfe3f6ca301f216b4cf881e10a739242",
-    "toolbarButtonGlyphs.svg": "881d1dfc706b546cfc79fa33045ff548",
+    "smallIcons.svg": "b11032f745140459cb066768b1ca514c",
+    "mediumIcons.svg": "83fe8b7d7cd399a48c70677a25aecfab",
     "breakpoint.svg": "69cd92d807259c022791112809b97799",
     "treeoutlineTriangles.svg": "017d2f89437df0afc6b9cd5ff43735d9",
     "audits_logo_bw.svg": "203dcb2ba32ef0f4595ad45bb8feffab",
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/resourceGlyphs.svg b/third_party/WebKit/Source/devtools/front_end/Images/src/resourceGlyphs.svg
deleted file mode 100644
index 8dee04f3..0000000
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/resourceGlyphs.svg
+++ /dev/null
@@ -1,156 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="140px"
-   height="20px"
-   viewBox="0 0 140 20"
-   version="1.1"
-   id="svg3369"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="resourceGlyphs.svg">
-  <metadata
-     id="metadata3417">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="640"
-     inkscape:window-height="480"
-     id="namedview3415"
-     showgrid="false"
-     inkscape:zoom="2.3357143"
-     inkscape:cx="57.178711"
-     inkscape:cy="10"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="svg3369" />
-  <!-- Generator: Sketch 3.7.2 (28276) - http://www.bohemiancoding.com/sketch -->
-  <title
-     id="title3371">resourceGlyphs</title>
-  <desc
-     id="desc3373">Created with Sketch.</desc>
-  <defs
-     id="defs3375" />
-  <g
-     style="fill:none;stroke:none"
-     id="Cookies"
-     transform="translate(120,0)">
-    <polygon
-       id="bounds"
-       points="0,0 16,0 16,16 0,16 "
-       style="opacity:0;fill:#e8f0fe" />
-    <path
-       d="m 13.526316,6.25 -1.473684,0 0,-0.75 c 0,-0.414 -0.330106,-0.75 -0.736843,-0.75 l -1.4736837,0 0,-0.75 C 9.8421053,3.586 9.512,3.25 9.1052632,3.25 l -0.7368421,0 0,-1.5 C 8.3684211,1.423 8.1606316,1.153 7.874,1.0495 7.8202105,1.021 7.7494737,1 7.6315789,1 3.9687368,1 1,4.02175 1,7.75 c 0,3.7275 2.9687368,6.75 6.6315789,6.75 3.6628421,0 6.6315791,-3.0225 6.6315791,-6.75 l 0,-0.75 c 0,-0.414 -0.330105,-0.75 -0.736842,-0.75 l 0,0 z M 3.5789474,8.5 C 2.9681828,8.5 2.4736842,7.9966711 2.4736842,7.375 c 0,-0.6216711 0.4944986,-1.125 1.1052632,-1.125 0.6107646,0 1.1052631,0.5033289 1.1052631,1.125 0,0.6216711 -0.4944985,1.125 -1.1052631,1.125 l 0,0 z M 4.6842105,4.375 c 0,-0.62175 0.4951579,-1.125 1.1052632,-1.125 0.6108421,0 1.1052631,0.50325 1.1052631,1.125 0,0.621 -0.494421,1.125 -1.1052631,1.125 C 5.1793684,5.5 4.6842105,4.996 4.6842105,4.375 l 0,0 z M 6.8947368,13 C 6.2841472,13 5.7894737,12.496661 5.7894737,11.875376 5.7894737,11.25409 6.2841472,10.75 6.8947368,10.75 7.5053264,10.75 8,11.25409 8,11.875376 8,12.496661 7.5053264,13 6.8947368,13 l 0,0 z M 7.2631579,9.25 C 6.6530526,9.25 6.1578947,8.746 6.1578947,8.125 6.1578947,7.504 6.6530526,7 7.2631579,7 c 0.6101053,0 1.1052632,0.504 1.1052632,1.125 0,0.621 -0.4951579,1.125 -1.1052632,1.125 l 0,0 z m 3.6842101,1.5 c -0.610105,0 -1.1052627,-0.504 -1.1052627,-1.125 0,-0.621 0.4951577,-1.125 1.1052627,-1.125 0.610106,0 1.105264,0.504 1.105264,1.125 0,0.621 -0.495158,1.125 -1.105264,1.125 l 0,0 z"
-       id="Shape"
-       inkscape:connector-curvature="0"
-       style="fill:#212121" />
-  </g>
-  <g
-     style="fill:none;stroke:none"
-     id="Group-2"
-     transform="translate(60,0)">
-    <rect
-       id="Rectangle-1-Copy-3"
-       x="0"
-       y="0"
-       width="16"
-       height="16"
-       style="opacity:0;fill:#e8f0fe" />
-    <path
-       d="M 8,6 C 11.313709,6 14,5.1045695 14,4 14,2.8954305 11.313709,2 8,2 4.6862915,2 2,2.8954305 2,4 2,5.1045695 4.6862915,6 8,6 z m -6,7 c 0,1.10457 2.6862915,2 6,2 3.313709,0 6,-0.89543 6,-2 l 0,-2 c 0,1.10457 -2.686291,2 -6,2 -3.3137085,0 -6,-0.89543 -6,-2 l 0,2 z m 0,-3 c 0,1.10457 2.6862915,2 6,2 3.313709,0 6,-0.89543 6,-2 L 14,8 C 14,9.1045695 11.313709,10 8,10 4.6862915,10 2,9.1045695 2,8 l 0,2 z M 2,7 c 0,1.1045695 2.6862915,2 6,2 3.313709,0 6,-0.8954305 6,-2 L 14,5 C 14,6.1045695 11.313709,7 8,7 4.6862915,7 2,6.1045695 2,5 l 0,2 z"
-       id="Combined-Shape"
-       inkscape:connector-curvature="0"
-       style="fill:#000000" />
-  </g>
-  <g
-     style="fill:none;stroke:none"
-     id="g3385"
-     transform="translate(80,0)">
-    <rect
-       id="rect3387"
-       x="0"
-       y="0"
-       width="16"
-       height="16"
-       style="opacity:0;fill:#e8f0fe" />
-    <path
-       d="M 2,3.9989566 C 2,3.4472481 2.4509752,3 2.990778,3 L 8,3 8,6 2,6 2,3.9989566 z M 2,11 8,11 8,14 2.990778,14 C 2.4435864,14 2,13.55734 2,13.001043 L 2,11 z M 2,7 8,7 8,10 2,10 2,7 z M 9,3 14.009222,3 C 14.556414,3 15,3.4426603 15,3.9989566 L 15,6 9,6 9,3 z m 0,8 6,0 0,2.001043 C 15,13.552752 14.549025,14 14.009222,14 L 9,14 9,11 z m 0,-4 6,0 0,3 -6,0 0,-3 z"
-       id="path3389"
-       inkscape:connector-curvature="0"
-       style="fill:#212121" />
-  </g>
-  <g
-     style="fill:none;stroke:none"
-     id="g3397"
-     transform="translate(40,0)">
-    <rect
-       id="rect3399"
-       x="0"
-       y="0"
-       width="16"
-       height="16"
-       style="opacity:0;fill:#e8f0fe" />
-    <path
-       d="m 3,4 10,0 0,9.007983 C 13,14.108144 12.112567,15 11.000385,15 l -6.00077,0 C 3.8952581,15 3,14.099824 3,13.007983 L 3,4 z M 2,2 14,2 14,3 2,3 2,2 z M 5,1 11,1 11,2 5,2 5,1 z"
-       id="path3401"
-       inkscape:connector-curvature="0"
-       style="fill:#212121" />
-  </g>
-  <g
-     style="fill:none;stroke:none"
-     id="Group"
-     transform="translate(20,0)">
-    <rect
-       id="rect3404"
-       x="0"
-       y="0"
-       width="16"
-       height="16"
-       style="opacity:0;fill:#e8f0fe" />
-    <path
-       d="M 6.5,3.2289011 6.5,1 l 3,0 0,2.2289011 c 0.707631,0.222254 1.347469,0.5975907 1.880704,1.0871978 l 1.931474,-1.115137 1.5,2.5980762 -1.930528,1.114591 C 12.959139,7.2633886 13,7.6269226 13,8 13,8.3730774 12.95914,8.7366114 12.88165,9.0863709 l 1.930528,1.1145911 -1.5,2.598076 -1.931474,-1.115137 C 10.847469,12.173508 10.207631,12.548845 9.5,12.771099 L 9.5,15 l -3,0 0,-2.228901 C 5.7923692,12.548845 5.1525306,12.173508 4.6192962,11.683901 l -1.931474,1.115137 -1.5,-2.598076 1.9305283,-1.1145911 C 3.0408605,8.7366114 3,8.3730774 3,8 3,7.6269226 3.0408605,7.2633886 3.1183505,6.9136291 l -1.9305283,-1.114591 1.5,-2.5980762 1.931474,1.115137 C 5.1525306,3.8264918 5.7923692,3.4511551 6.5,3.2289011 z M 8,10.5 C 9.3807119,10.5 10.5,9.3807119 10.5,8 10.5,6.6192881 9.3807119,5.5 8,5.5 6.6192881,5.5 5.5,6.6192881 5.5,8 c 0,1.3807119 1.1192881,2.5 2.5,2.5 z"
-       id="path3406"
-       inkscape:connector-curvature="0"
-       style="fill:#212121" />
-  </g>
-  <g
-     style="fill:none;stroke:none"
-     id="g3408">
-    <rect
-       id="rect3410"
-       x="0"
-       y="0"
-       width="16"
-       height="16" />
-    <g
-       id="Group-5"
-       transform="translate(3,1)"
-       style="fill:#000000">
-      <path
-         d="M 6,0 0.99539757,0 C 0.4556644,0 0,0.45078007 0,1.0068455 L 0,12.993154 C 0,13.550051 0.44565467,14 0.99539757,14 L 9.0046024,14 C 9.5443356,14 10,13.54922 10,12.993154 L 10,4 6,0 z M 9.29,4 6,4 6,0.71000004 9.29,4 z"
-         id="path3413"
-         inkscape:connector-curvature="0" />
-    </g>
-  </g>
-</svg>
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/smallIcons.svg b/third_party/WebKit/Source/devtools/front_end/Images/src/smallIcons.svg
index 74904568..a7d01295 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/smallIcons.svg
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/smallIcons.svg
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -10,725 +8,827 @@
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="190"
-   height="30"
-   id="svg3250"
+   width="90"
+   height="90"
+   id="svg4185"
    version="1.1"
    inkscape:version="0.48.4 r9939"
    sodipodi:docname="smallIcons.svg">
-  <defs
-     id="defs3252">
-    <linearGradient
-       gradientTransform="matrix(0,-0.41666666,-0.41666666,0,218,106)"
-       gradientUnits="userSpaceOnUse"
-       id="p"
-       x1="0"
-       x2="24"
-       xlink:href="#l"
-       y1="0"
-       y2="0" />
-    <linearGradient
-       id="l">
-      <stop
-         offset="0"
-         stop-color="#d7687d"
-         id="stop3458" />
-      <stop
-         offset="1"
-         stop-color="#b21402"
-         id="stop3460" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#l-0"
-       id="linearGradient3239"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0,-0.41666666,-0.41666666,0,249.99999,117)"
-       x1="0"
-       y1="0"
-       x2="24"
-       y2="0" />
-    <linearGradient
-       id="l-0">
-      <stop
-         offset="0"
-         stop-color="#d7687d"
-         id="stop3458-8" />
-      <stop
-         offset="1"
-         stop-color="#b21402"
-         id="stop3460-8" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(0.71428571,0,0,0.71428571,132.28571,37.714287)"
-       gradientUnits="userSpaceOnUse"
-       id="q"
-       x1="113"
-       x2="127"
-       xlink:href="#a"
-       y1="104"
-       y2="104" />
-    <linearGradient
-       id="a">
-      <stop
-         offset="0"
-         stop-color="#606eda"
-         id="stop3403" />
-      <stop
-         offset="1"
-         stop-color="#021db2"
-         id="stop3405" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(0,0.43965518,0.78048781,0,44.48744,928.48286)"
-       gradientUnits="userSpaceOnUse"
-       id="t"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#i"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="i">
-      <stop
-         offset="0"
-         stop-color="#f00"
-         stop-opacity="0"
-         id="stop3443" />
-      <stop
-         offset="1"
-         stop-color="#f0cb68"
-         stop-opacity="0.71"
-         id="stop3445" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(0,-0.62931035,0.92682926,0,29.46895,1170.8907)"
-       gradientUnits="userSpaceOnUse"
-       id="s"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#j"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="j">
-      <stop
-         offset="0"
-         stop-color="#e60000"
-         stop-opacity="0.65"
-         id="stop3448" />
-      <stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0.91"
-         id="stop3450" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(0,1.3793103,-1.3008129,0,363.08462,-218.35335)"
-       gradientUnits="userSpaceOnUse"
-       id="r"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#k"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="k">
-      <stop
-         offset="0"
-         stop-color="#a10000"
-         id="stop3453" />
-      <stop
-         offset="1"
-         stop-color="#c60000"
-         id="stop3455" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(-0.00480259,0.43959676,0.7803841,0.00852566,65.60742,927.52853)"
-       gradientUnits="userSpaceOnUse"
-       id="w"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#f"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="f">
-      <stop
-         offset="0"
-         stop-color="#00d600"
-         stop-opacity="0"
-         id="stop3428" />
-      <stop
-         offset="1"
-         stop-color="#d8fc7b"
-         stop-opacity="0.81"
-         id="stop3430" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(0.00687428,-0.62922672,0.92670611,0.01012422,47.870946,1169.7969)"
-       gradientUnits="userSpaceOnUse"
-       id="v"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#g"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="g">
-      <stop
-         offset="0"
-         stop-color="#00ba00"
-         id="stop3433" />
-      <stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0.91"
-         id="stop3435" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(-0.01506784,1.3792098,-1.3007182,-0.01421029,377.66542,-216.8212)"
-       gradientUnits="userSpaceOnUse"
-       id="u"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#h"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="h">
-      <stop
-         offset="0"
-         stop-color="#00a104"
-         id="stop3438" />
-      <stop
-         offset="1"
-         stop-color="#00c605"
-         id="stop3440" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(0,0.43965518,0.78048781,0,84.443253,928.43867)"
-       gradientUnits="userSpaceOnUse"
-       id="y"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#d"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="d">
-      <stop
-         offset="0"
-         stop-color="#ffa801"
-         stop-opacity="0"
-         id="stop3418" />
-      <stop
-         offset="1"
-         stop-color="#f0fb3d"
-         id="stop3420" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(0,-0.62931035,0.92682926,0,69.468953,1170.8907)"
-       gradientUnits="userSpaceOnUse"
-       id="x"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#e"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="e">
-      <stop
-         offset="0"
-         stop-color="#ffbd00"
-         stop-opacity="0.65"
-         id="stop3423" />
-      <stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0.91"
-         id="stop3425" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(0,0.43965518,0.78048781,0,84.443591,-93.92353)"
-       gradientUnits="userSpaceOnUse"
-       id="y-3"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#d"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       gradientTransform="matrix(0,-0.62931035,0.92682926,0,69.469291,148.5285)"
-       gradientUnits="userSpaceOnUse"
-       id="x-8"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#e"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       gradientTransform="matrix(-0.00480259,0.43959676,0.7803841,0.00852566,65.607758,-94.83367)"
-       gradientUnits="userSpaceOnUse"
-       id="w-1"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#f"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       gradientTransform="matrix(0.00687428,-0.62922672,0.92670611,0.01012422,47.871284,147.4347)"
-       gradientUnits="userSpaceOnUse"
-       id="v-5"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#g"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       y2="103.15625"
-       x2="235.125"
-       y1="103.15625"
-       x1="227.875"
-       gradientTransform="matrix(-0.01506693,1.3791269,-1.30064,-0.01420944,282.65749,-312.8021)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3426"
-       xlink:href="#h"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientTransform="matrix(0,0.43965518,0.78048781,0,44.487778,-93.87934)"
-       gradientUnits="userSpaceOnUse"
-       id="t-9"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#i"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       gradientTransform="matrix(0,-0.62931035,0.92682926,0,29.469288,148.5285)"
-       gradientUnits="userSpaceOnUse"
-       id="s-9"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#j"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       y2="103.15625"
-       x2="235.125"
-       y1="103.15625"
-       x1="227.875"
-       gradientTransform="matrix(0,1.3793103,-1.3008129,0,259.08496,-314.35332)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3398"
-       xlink:href="#k"
-       inkscape:collect="always" />
-    <linearGradient
-       y2="104"
-       x2="127"
-       y1="104"
-       x1="113"
-       gradientTransform="matrix(0.71428571,0,0,0.71428571,-0.71395168,-69.28574)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3359"
-       xlink:href="#a"
-       inkscape:collect="always" />
-    <linearGradient
-       y2="0"
-       x2="24"
-       y1="0"
-       x1="0"
-       gradientTransform="matrix(0,-0.41666666,-0.41666666,0,25.000338,10)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3308"
-       xlink:href="#l"
-       inkscape:collect="always" />
-    <linearGradient
-       id="h-5">
-      <stop
-         offset="0"
-         stop-color="#00a104"
-         id="stop3438-3" />
-      <stop
-         offset="1"
-         stop-color="#00c605"
-         id="stop3440-5" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(0.01260285,-1.1632762,1.6989611,0.01871704,36.597071,217.35825)"
-       gradientUnits="userSpaceOnUse"
-       id="v-5-6"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#g-2"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="g-2">
-      <stop
-         offset="0"
-         stop-color="#00ba00"
-         id="stop3433-9" />
-      <stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0.91"
-         id="stop3435-1" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(-0.00480259,0.43959676,0.7803841,0.00852566,65.607758,-94.83367)"
-       gradientUnits="userSpaceOnUse"
-       id="w-1-2"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#f-7"
-       y1="103.15625"
-       y2="103.15625" />
-    <linearGradient
-       id="f-7">
-      <stop
-         offset="0"
-         stop-color="#00d600"
-         stop-opacity="0"
-         id="stop3428-0" />
-      <stop
-         offset="1"
-         stop-color="#d8fc7b"
-         stop-opacity="0.81"
-         id="stop3430-9" />
-    </linearGradient>
-    <linearGradient
-       y2="103.15625"
-       x2="235.125"
-       y1="103.15625"
-       x1="227.875"
-       gradientTransform="matrix(-0.00880475,0.81269982,1.4307041,0.01576172,69.113955,-230.53282)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3430"
-       xlink:href="#f-7"
-       inkscape:collect="always" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11"
-     inkscape:cx="12.179671"
-     inkscape:cy="-3.2079823"
-     inkscape:document-units="px"
-     inkscape:current-layer="svg3250"
-     showgrid="true"
-     inkscape:window-width="1278"
-     inkscape:window-height="1546"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3258"
-       empspacing="2"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true"
-       spacingx="10px"
-       spacingy="10px"
-       dotted="false" />
-  </sodipodi:namedview>
   <metadata
-     id="metadata3255">
+     id="metadata4459">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
+  <defs
+     id="defs4457" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1822"
+     inkscape:window-height="1060"
+     id="namedview4455"
+     showgrid="true"
+     inkscape:zoom="5.2444444"
+     inkscape:cx="28.123177"
+     inkscape:cy="43.8192"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg4185">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4461"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       spacingx="10px"
+       spacingy="10px" />
+  </sodipodi:namedview>
   <g
-     id="g1817">
-    <path
-       style="fill:url(#linearGradient3308)"
-       inkscape:connector-curvature="0"
-       id="path3699"
-       d="m 25.000338,-4.779502e-7 c -2.76,0 -5,2.2399999779502 -5,4.9999999779502 0,2.76 2.24,5.0000005 5,5.0000005 2.76,0 5,-2.2400005 5,-5.0000005 0,-2.76 -2.24,-4.99999997795019 -5,-4.99999997795019" />
-    <path
-       style="fill:#eb3941"
-       inkscape:connector-curvature="0"
-       id="path3701"
-       d="m 20.360338,4.9999995 c 0,2.56 2.08,4.64 4.64,4.64 2.56,0 4.64,-2.08 4.64,-4.64 0,-2.56 -2.08,-4.63999998 -4.64,-4.63999998 -2.56,0 -4.64,2.07999998 -4.64,4.63999998" />
-    <path
-       style="stroke:#ffffff"
-       inkscape:connector-curvature="0"
-       id="path3703"
-       d="m 23.000338,2.9999995 4,4" />
-    <path
-       style="stroke:#ffffff"
-       inkscape:connector-curvature="0"
-       id="path3705"
-       d="m 27.000338,2.9999995 -4,4" />
-  </g>
-  <g
-     id="g1823">
-    <path
-       style="stroke:#c19600;stroke-width:2;stroke-linejoin:round"
-       inkscape:connector-curvature="0"
-       id="path3707"
-       d="m 61.000338,8.9999995 4,-8 4,8 z" />
-    <path
-       style="fill:#f4bd00;stroke:#f5bd00;stroke-width:1.5;stroke-linejoin:round"
-       inkscape:connector-curvature="0"
-       id="path3709"
-       d="m 61.000338,8.9999995 4,-8 4,8 z" />
-    <path
-       style="fill:#ad8601"
-       inkscape:connector-curvature="0"
-       id="path3711"
-       d="m 63.750338,2.7499995 h 2.5 v 2.5 l -0.5,1.75 h -1.5 l -0.5,-1.75 v -2.5 m 0,5.25 h 2.5 v 1.25 h -2.5" />
-    <path
-       style="fill:#ffffff"
-       inkscape:connector-curvature="0"
-       id="path3713"
-       d="m 64.000338,2.9999995 h 2 v 2.25 l -0.5,1.75 h -1 l -0.5,-1.75 v -2.25 m 0,5 h 2 v 1 h -2" />
-  </g>
-  <g
-     id="g1828">
-    <path
-       style="fill:url(#linearGradient3359)"
-       inkscape:connector-curvature="0"
-       id="path3741"
-       d="m 85.000338,-4.779502e-7 c -2.76,0 -5,2.2399999779502 -5,4.9999999779502 0,2.76 2.24,5.0000005 5,5.0000005 2.76,0 5,-2.2400005 5,-5.0000005 0,-2.76 -2.24,-4.99999997795019 -5,-4.99999997795019" />
-    <path
-       style="fill:#2a53cd"
-       inkscape:connector-curvature="0"
-       id="path3743"
-       d="m 80.360338,4.9999995 c 0,2.56 2.08,4.64 4.64,4.64 2.56,0 4.64,-2.08 4.64,-4.64 0,-2.56 -2.08,-4.63999998 -4.64,-4.63999998 -2.56,0 -4.64,2.07999998 -4.64,4.63999998" />
-    <path
-       style="fill:#ffffff"
-       inkscape:connector-curvature="0"
-       id="path3745"
-       d="m 83.930338,2.1399995 c -0.03,-0.53 0.55,-0.97 1.06,-0.83 0.5,0.12 0.79,0.73 0.56,1.18 -0.2,0.44 -0.79,0.61 -1.2,0.36 -0.26,-0.14 -0.42,-0.42 -0.42,-0.71 z m 1.7,5.46 c 0.22,0 0.45,0 0.67,0 0,0.18 0,0.35 0,0.53 -0.96,0 -1.93,0 -2.89,0 0,-0.18 0,-0.35 0,-0.53 0.22,0 0.44,0 0.66,0 0,-1.2 0,-2.41 0,-3.61 -0.22,0 -0.44,0 -0.66,0 0,-0.18 0,-0.35 0,-0.53 0.74,0 1.48,0 2.22,0 0,1.38 0,2.76 0,4.14 z" />
-  </g>
-  <g
-     id="g2768">
-    <g
-       id="g1831">
+     id="g4187">
+    <svg
+       width="10"
+       height="10"
+       id="svg4189"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
       <path
-         d="m 103.25034,-4.779502e-7 c -0.7,0 -1.25,0.4999999979502 -1.25,1.2499999779502 v 7.5 c 0,0.7 0.5,1.2500005 1.25,1.2500005 h 3.5 c 0.7,0 1.25,-0.5000005 1.25,-1.2500005 v -7.5 c 0,-0.69999998 -0.5,-1.2499999779502 -1.25,-1.2499999779502 z M 103.00034,0.9999995 h 4 v 7 h -4 z m 2,7.25 c 0.4,0 0.75,0.3 0.75,0.75 0,0.4 -0.3,0.75 -0.75,0.75 -0.4,0 -0.75,-0.3 -0.75,-0.75 0,-0.4 0.3,-0.75 0.75,-0.75 z"
-         id="path3765"
+         transform="translate(-80,-20)"
+         d="m 80,20.995 c 0,-0.54974 0.45566,-0.9954 0.9954,-0.9954 h 8.0092 c 0.54974,0 0.9954,0.45566 0.9954,0.9954 v 8.0092 c 0,0.54974 -0.45566,0.9954 -0.9954,0.9954 H 80.9954 C 80.44566,29.9996 80,29.54394 80,29.0042 z m 5.1233,4.7444 c 2.5673,-0.42788 3.6267,-1.193 3.6267,-3.7398 h -1.5 c 0,1.6199 -0.44058,1.9381 -2.3733,2.2602 -2.5673,0.42788 -3.6267,1.193 -3.6267,3.7398 h 1.5 c 0,-1.6199 0.44058,-1.9381 2.3733,-2.2602 z"
+         id="path4191"
          inkscape:connector-curvature="0" />
-    </g>
+    </svg>
   </g>
   <g
-     id="g1837">
-    <path
-       style="fill:url(#linearGradient3398)"
-       inkscape:connector-curvature="0"
-       id="path3715"
-       d="m 125.00034,10 c -2.76,0 -5,-2.2400005 -5,-5.0000005 0,-2.76 2.24,-4.9999999779502 5,-4.9999999779502 2.76,0 5,2.2399999779502 5,4.9999999779502 0,2.76 -2.24,5.0000005 -5,5.0000005 z" />
-    <path
-       style="fill:#dd0000"
-       inkscape:connector-curvature="0"
-       id="path3717"
-       d="m 129.50034,4.9999995 c 0,2.49 -2.01,4.5 -4.5,4.5 -2.49,0 -4.5,-2.01 -4.5,-4.5 0,-2.49 2.01,-4.49999998 4.5,-4.49999998 2.49,0 4.5,2.00999998 4.5,4.49999998 z" />
-    <path
-       style="fill:url(#s-9)"
-       inkscape:connector-curvature="0"
-       id="path3719"
-       d="m 125.03034,0.52999952 c 1.97,0 3.56,1.01999998 3.56,2.27999998 0,1.26 -1.59,2.28 -3.56,2.28 -1.97,0 -3.56,-1.02 -3.56,-2.28 0,-1.26 1.59,-2.27999998 3.56,-2.27999998 z" />
-    <path
-       style="fill:url(#t-9)"
-       inkscape:connector-curvature="0"
-       id="path3721"
-       d="m 125.03034,9.4699995 c 1.66,0 3,-0.71 3,-1.59 0,-0.88 -1.34,-1.59 -3,-1.59 -1.66,0 -3,0.71 -3,1.59 0,0.88 1.34,1.59 3,1.59 z" />
+     transform="translate(20,0)"
+     id="g4193">
+    <svg
+       width="10"
+       height="10"
+       id="svg4195"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-128,-109)"
+         d="m 131.65,116.21 -1.44,-2.03 -1.21,1.21 2.55,3.61 6.45,-7.67 -1.12,-1.33 z"
+         id="path4197"
+         inkscape:connector-curvature="0" />
+    </svg>
   </g>
   <g
-     id="g1843">
-    <path
-       style="fill:url(#linearGradient3426)"
-       inkscape:connector-curvature="0"
-       id="path3723"
-       d="m 144.95034,9.9996995 c -2.75983,-0.03 -4.9797,-2.2899 -4.9497,-5.0497 0.03,-2.7598 2.28986,-4.97969998 5.0497,-4.94969997795 2.75983,0.0299999979 4.9797,2.28989997795 4.9497,5.04969997795 -0.03,2.7598 -2.28986,4.9797005 -5.0497,4.9497 z" />
-    <path
-       style="fill:#00be00"
-       inkscape:connector-curvature="0"
-       id="path3725"
-       d="m 149.50007,5.0499995 c -0.03,2.4898 -2.05988,4.4797 -4.54973,4.4497 -2.48985,-0.03 -4.47973,-2.0598 -4.44973,-4.5497 0.03,-2.4898 2.05988,-4.47969998 4.54973,-4.44969998 2.48985,0.03 4.47973,2.05979998 4.44973,4.54969998 z" />
-    <path
-       style="fill:url(#v-5)"
-       inkscape:connector-curvature="0"
-       id="path3727"
-       d="m 145.08033,0.53029952 c 1.96989,0.02 3.54979,1.05989998 3.53979,2.31979998 -0.01,1.26 -1.6199,2.2599 -3.58978,2.2399 -1.96988,-0.02 -3.54979,-1.0599 -3.53979,-2.3199 0.01,-1.2599 1.6199,-2.25979998 3.58978,-2.23979998 z" />
-    <path
-       style="fill:url(#w-1)"
-       inkscape:connector-curvature="0"
-       id="path3729"
-       d="m 144.98034,9.4096995 c 1.6599,0.02 3.00982,-0.6799 3.01982,-1.5599 0.01,-0.8799 -1.32992,-1.6099 -2.97982,-1.6299 -1.6599,-0.02 -3.00982,0.68 -3.01982,1.5599 -0.01,0.88 1.32992,1.6099 2.97982,1.6299 z" />
+     transform="translate(0,20)"
+     id="g4199">
+    <svg
+       width="10"
+       height="10"
+       id="svg4201"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-40,-19)"
+         d="m 46.5,25 c 0,0.55 0.45,1 1,1 0.55,0 1,-0.45 1,-1 0,-0.55 -0.45,-1 -1,-1 -0.55,0 -1,0.45 -1,1"
+         id="path4203"
+         inkscape:connector-curvature="0"
+         style="fill:#bababa" />
+      <path
+         transform="translate(-40,-19)"
+         d="m 45.75,21.75 -3.5,3.25 3.5,3.25"
+         id="path4205"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#bababa;stroke-width:1.5" />
+    </svg>
   </g>
   <g
-     id="g1849">
-    <path
-       style="fill:#e5a600"
-       inkscape:connector-curvature="0"
-       id="path3731"
-       d="m 165.00034,10 c -2.76,0 -5,-2.2400005 -5,-5.0000005 0,-2.76 2.24,-4.9999999779502 5,-4.9999999779502 2.76,0 5,2.2399999779502 5,4.9999999779502 0,2.76 -2.24,5.0000005 -5,5.0000005 z" />
-    <path
-       style="fill:#ffbd00"
-       inkscape:connector-curvature="0"
-       id="path3733"
-       d="m 169.50034,4.9999995 c 0,2.49 -2.01,4.5 -4.5,4.5 -2.49,0 -4.5,-2.01 -4.5,-4.5 0,-2.49 2.01,-4.49999998 4.5,-4.49999998 2.49,0 4.5,2.00999998 4.5,4.49999998 z" />
-    <path
-       style="fill:url(#x-8)"
-       inkscape:connector-curvature="0"
-       id="path3735"
-       d="m 165.03034,0.52999952 c 1.97,0 3.56,1.01999998 3.56,2.27999998 0,1.26 -1.59,2.28 -3.56,2.28 -1.97,0 -3.56,-1.02 -3.56,-2.28 0,-1.26 1.59,-2.27999998 3.56,-2.27999998 z" />
-    <path
-       style="fill:url(#y-3)"
-       inkscape:connector-curvature="0"
-       id="path3737"
-       d="m 164.99034,9.4199995 c 1.66,0 3,-0.71 3,-1.59 0,-0.88 -1.34,-1.59 -3,-1.59 -1.66,0 -3,0.71 -3,1.59 0,0.88 1.34,1.59 3,1.59 z" />
+     transform="translate(20,20)"
+     id="g4207">
+    <svg
+       width="10"
+       height="10"
+       id="svg4209"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-177,-98)"
+         d="m 184.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4211"
+         inkscape:connector-curvature="0"
+         style="fill-opacity:0.23999999" />
+      <path
+         transform="translate(-177,-98)"
+         d="M 184.5,99.93 183.57,99 181,101.57 178.43,99 l -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+         id="path4213"
+         inkscape:connector-curvature="0"
+         style="fill:#676767" />
+    </svg>
   </g>
   <g
-     id="g1884">
-    <path
-       style="fill:none;stroke:#939393;stroke-width:1.5"
-       inkscape:connector-curvature="0"
-       id="path3693"
-       d="m 3.2503383,21.75 3.5,3.25 -3.5,3.25" />
+     transform="translate(40,0)"
+     id="g4215">
+    <svg
+       width="10"
+       height="10"
+       id="svg4217"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-100,0)"
+         d="m 103.25,-4.7795e-7 c -0.7,0 -1.25,0.49999999795 -1.25,1.24999997795 v 7.5 c 0,0.7 0.5,1.25 1.25,1.25 h 3.5 c 0.7,0 1.25,-0.5 1.25,-1.25 v -7.5 C 108,0.54999952 107.5,-4.7795e-7 106.75,-4.7795e-7 z M 103,0.99999952 h 4 V 7.9999995 h -4 z m 2,7.24999998 c 0.4,0 0.75,0.3 0.75,0.75 0,0.4 -0.3,0.75 -0.75,0.75 -0.4,0 -0.75,-0.3 -0.75,-0.75 0,-0.4 0.3,-0.75 0.75,-0.75 z"
+         id="path4219"
+         inkscape:connector-curvature="0" />
+    </svg>
   </g>
   <g
-     id="g1881">
-    <path
-       style="fill:none;stroke:#367cf1;stroke-width:1.5"
-       inkscape:connector-curvature="0"
-       id="path3691"
-       d="m 23.250338,21.75 3.5,3.25 -3.5,3.25" />
+     transform="translate(40,20)"
+     id="g4221">
+    <svg
+       width="10"
+       height="10"
+       id="svg4223"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-20,0)"
+         d="m 25,-4.7795e-7 c -2.76,0 -5,2.23999997795 -5,4.99999997795 0,2.76 2.24,5 5,5 2.76,0 5,-2.24 5,-5 C 30,2.2399995 27.76,-4.7795e-7 25,-4.7795e-7"
+         id="path4225"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite6_a)" />
+      <path
+         transform="translate(-20,0)"
+         d="m 20.36,5 c 0,2.56 2.08,4.64 4.64,4.64 2.56,0 4.64,-2.08 4.64,-4.64 0,-2.56 -2.08,-4.64 -4.64,-4.64 -2.56,0 -4.64,2.08 -4.64,4.64"
+         id="path4227"
+         inkscape:connector-curvature="0"
+         style="fill:#eb3941" />
+      <path
+         transform="translate(-20,0)"
+         d="m 23,3 4,4"
+         id="path4229"
+         inkscape:connector-curvature="0"
+         style="stroke:#ffffff" />
+      <path
+         transform="translate(-20,0)"
+         d="M 27,3 23,7"
+         id="path4231"
+         inkscape:connector-curvature="0"
+         style="stroke:#ffffff" />
+      <defs
+         id="defs4233">
+        <linearGradient
+           id="sprite6_b">
+          <stop
+             stop-color="#d7687d"
+             offset="0"
+             id="stop4236" />
+          <stop
+             stop-color="#b21402"
+             offset="1"
+             id="stop4238" />
+        </linearGradient>
+        <linearGradient
+           id="sprite6_a"
+           x2="24"
+           gradientTransform="matrix(0,-0.41667,-0.41667,0,25,10)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite6_b" />
+      </defs>
+    </svg>
   </g>
   <g
-     id="g1878">
-    <path
-       style="fill:#bababa"
-       inkscape:connector-curvature="0"
-       id="path3695"
-       d="m 46.500338,25 c 0,0.55 0.45,1 1,1 0.55,0 1,-0.45 1,-1 0,-0.55 -0.45,-1 -1,-1 -0.55,0 -1,0.45 -1,1" />
-    <path
-       style="fill:none;stroke:#bababa;stroke-width:1.5"
-       inkscape:connector-curvature="0"
-       id="path3697"
-       d="m 45.750338,21.75 -3.5,3.25 3.5,3.25" />
-  </g>
-  <path
-     style="fill:#000000;stroke:none"
-     id="Combined-Shape"
-     d="M 80.000338,20.995398 C 80.000338,20.445655 80.456002,20 80.995736,20 h 8.009204 c 0.549743,0 0.995398,0.455664 0.995398,0.995398 v 8.009204 C 90.000338,29.554345 89.544674,30 89.00494,30 h -8.009204 c -0.549743,0 -0.995398,-0.455664 -0.995398,-0.995398 z m 5.123299,4.744397 C 87.690923,25.311914 88.750338,24.546782 88.750338,22 h -1.5 c 0,1.619885 -0.440585,1.938086 -2.373299,2.260205 C 82.309753,24.688086 81.250338,25.453218 81.250338,28 h 1.5 c 0,-1.619885 0.440585,-1.938086 2.373299,-2.260205 z"
-     inkscape:connector-curvature="0" />
-  <rect
-     style="fill:#000000;fill-opacity:0;stroke:none"
-     id="Rectangle"
-     x="60.00034"
-     y="20"
-     width="10"
-     height="10" />
-  <path
-     style="fill:#000000;stroke:none"
-     inkscape:connector-curvature="0"
-     d="M 67.500338,22.5 V 20 h -7.5 v 7.5 h 2.5 V 30 h 7.5 v -7.5 z m -6.5,-1.5 h 5.5 v 5.5 h -5.5 z m 2.5,6.5 h 4 v -4 h 1.5 V 29 h -5.5 z"
-     id="Combined-Shape-6" />
-  <polygon
-     style="fill:#000000;fill-opacity:0.25;stroke:none"
-     id="Rectangle-6-Copy"
-     points="3.5,7.5 7.5,7.5 7.5,3.5 9,3.5 9,9 3.5,9 "
-     transform="translate(60.000338,20)" />
-  <g
-     id="g1861">
-    <path
-       inkscape:connector-curvature="0"
-       id="path3248"
-       d="m 140.45434,20.4669 v 9.0791 h 5.37181 l 3.58126,-4.54 -3.58126,-4.5391 z"
-       style="fill:#ef9d0d;fill-opacity:1;stroke:#a36c01;stroke-width:0.90793478px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+     transform="translate(0,40)"
+     id="g4241">
+    <svg
+       width="10"
+       height="10"
+       id="svg4243"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(-0.89336,0,0,0.81469,170.27,-15.367)"
+         d="m 186,20 -5,5 5,5 v -2 h 3 v -6 h -3.0004 z"
+         id="path4245"
+         inkscape:connector-curvature="0"
+         style="fill:#adf2ad;stroke:#007200" />
+    </svg>
   </g>
   <g
-     id="g1858">
-    <path
-       inkscape:connector-curvature="0"
-       id="path3248-6"
-       d="m 160.45432,20.467 v 9.079 h 5.37302 l 3.58206,-4.5398 -3.58206,-4.5392 z"
-       style="fill:#698cfe;fill-opacity:1;stroke:#4073f4;stroke-width:0.90792048px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+     transform="translate(20,40)"
+     id="g4247">
+    <svg
+       width="10"
+       height="10"
+       id="svg4249"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-140,0)"
+         d="m 144.95,9.9997 c -2.7598,-0.03 -4.9797,-2.2899 -4.9497,-5.0497 0.03,-2.7598 2.2899,-4.9797 5.0497,-4.9497 2.7598,0.03 4.9797,2.2899 4.9497,5.0497 -0.03,2.7598 -2.2899,4.9797 -5.0497,4.9497 z"
+         id="path4251"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite8_a)" />
+      <path
+         transform="translate(-140,0)"
+         d="m 149.5,5.05 c -0.03,2.4898 -2.0599,4.4797 -4.5497,4.4497 -2.4898,-0.03 -4.4797,-2.0598 -4.4497,-4.5497 0.03,-2.4898 2.0599,-4.4797 4.5497,-4.4497 2.4898,0.03 4.4797,2.0598 4.4497,4.5497 z"
+         id="path4253"
+         inkscape:connector-curvature="0"
+         style="fill:#00be00" />
+      <path
+         transform="translate(-140,0)"
+         d="m 145.08,0.5303 c 1.9699,0.02 3.5498,1.0599 3.5398,2.3198 -0.01,1.26 -1.6199,2.2599 -3.5898,2.2399 -1.9699,-0.02 -3.5498,-1.0599 -3.5398,-2.3199 0.01,-1.2599 1.6199,-2.2598 3.5898,-2.2398 z"
+         id="path4255"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite8_b)" />
+      <path
+         transform="translate(-140,0)"
+         d="m 144.98,9.4097 c 1.6599,0.02 3.0098,-0.6799 3.0198,-1.5599 0.01,-0.8799 -1.3299,-1.6099 -2.9798,-1.6299 -1.6599,-0.02 -3.0098,0.68 -3.0198,1.5599 -0.01,0.88 1.3299,1.6099 2.9798,1.6299 z"
+         id="path4257"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite8_c)" />
+      <defs
+         id="defs4259">
+        <linearGradient
+           id="sprite8_j">
+          <stop
+             stop-color="#00d600"
+             stop-opacity="0"
+             offset="0"
+             id="stop4262" />
+          <stop
+             stop-color="#d8fc7b"
+             stop-opacity=".81"
+             offset="1"
+             id="stop4264" />
+        </linearGradient>
+        <linearGradient
+           id="sprite8_k">
+          <stop
+             stop-color="#00ba00"
+             offset="0"
+             id="stop4267" />
+          <stop
+             stop-color="#fff"
+             stop-opacity=".91"
+             offset="1"
+             id="stop4269" />
+        </linearGradient>
+        <linearGradient
+           id="sprite8_l">
+          <stop
+             stop-color="#00a104"
+             offset="0"
+             id="stop4272" />
+          <stop
+             stop-color="#00c605"
+             offset="1"
+             id="stop4274" />
+        </linearGradient>
+        <linearGradient
+           id="sprite8_c"
+           x1="227.88"
+           x2="235.12"
+           y1="103.16"
+           y2="103.16"
+           gradientTransform="matrix(-0.0048,0.4396,0.78038,0.00853,65.608,-94.834)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite8_j" />
+        <linearGradient
+           id="sprite8_b"
+           x1="227.88"
+           x2="235.12"
+           y1="103.16"
+           y2="103.16"
+           gradientTransform="matrix(0.00687,-0.62923,0.9267,0.01012,47.871,147.44)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite8_k" />
+        <linearGradient
+           id="sprite8_a"
+           x1="227.88"
+           x2="235.12"
+           y1="103.16"
+           y2="103.16"
+           gradientTransform="matrix(-0.01507,1.3791,-1.3006,-0.0142,282.66,-312.8)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite8_l" />
+      </defs>
+    </svg>
   </g>
   <g
-     id="g1855">
-    <path
-       style="fill:#4688f1;fill-opacity:1"
-       d="m 186,20 -5,5 5,5 0,-2 3,0 0,-6 -3,0 z"
-       id="path3660-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccc" />
+     transform="translate(40,40)"
+     id="g4279">
+    <svg
+       width="10"
+       height="10"
+       id="svg4281"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-80,0)"
+         d="m 85,-4.7795e-7 c -2.76,0 -5,2.23999997795 -5,4.99999997795 0,2.76 2.24,5 5,5 2.76,0 5,-2.24 5,-5 C 90,2.2399995 87.76,-4.7795e-7 85,-4.7795e-7"
+         id="path4283"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite9_a)" />
+      <path
+         transform="translate(-80,0)"
+         d="m 80.36,5 c 0,2.56 2.08,4.64 4.64,4.64 2.56,0 4.64,-2.08 4.64,-4.64 0,-2.56 -2.08,-4.64 -4.64,-4.64 -2.56,0 -4.64,2.08 -4.64,4.64"
+         id="path4285"
+         inkscape:connector-curvature="0"
+         style="fill:#2a53cd" />
+      <path
+         transform="translate(-80,0)"
+         d="m 83.93,2.14 c -0.03,-0.53 0.55,-0.97 1.06,-0.83 0.5,0.12 0.79,0.73 0.56,1.18 -0.2,0.44 -0.79,0.61 -1.2,0.36 C 84.09,2.71 83.93,2.43 83.93,2.14 z m 1.7,5.46 H 86.3 V 8.13 H 83.41 V 7.6 h 0.66 V 3.99 H 83.41 V 3.46 h 2.22 V 7.6 z"
+         id="path4287"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff" />
+      <defs
+         id="defs4289">
+        <linearGradient
+           id="sprite9_d">
+          <stop
+             stop-color="#606eda"
+             offset="0"
+             id="stop4292" />
+          <stop
+             stop-color="#021db2"
+             offset="1"
+             id="stop4294" />
+        </linearGradient>
+        <linearGradient
+           id="sprite9_a"
+           x1="113"
+           x2="127"
+           y1="104"
+           y2="104"
+           gradientTransform="matrix(0.71429,0,0,0.71429,-0.714,-69.286)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite9_d" />
+      </defs>
+    </svg>
   </g>
   <g
-     transform="matrix(-1,0,0,1,370,-19.954546)"
-     id="g1855-3">
-    <path
-       style="fill:#4688f1;fill-opacity:1"
-       d="m 186,20 -5,5 5,5 0,-2 3,0 0,-6 -3,0 z"
-       id="path3660-9-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccc" />
+     transform="translate(60,0)"
+     id="g4297">
+    <svg
+       width="10"
+       height="10"
+       id="svg4299"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-160,-20)"
+         d="m 160.45,20.467 v 9.079 h 5.373 l 3.5821,-4.5398 -3.5821,-4.5392 z"
+         id="path4301"
+         inkscape:connector-curvature="0"
+         style="fill:#698cfe;stroke:#4073f4;stroke-width:0.90799999" />
+    </svg>
   </g>
   <g
-     id="g3426"
-     transform="matrix(-0.89336027,0,0,0.81468821,290.27165,4.6327948)"
-     style="fill:#adf2ad;fill-opacity:1;stroke:#007200;stroke-opacity:1">
-    <path
-       sodipodi:nodetypes="cccccccc"
-       inkscape:connector-curvature="0"
-       id="path3428"
-       d="m 186,20 -5,5 5,5 0,-2 3,0 0,-6 -3.0004,0 z"
-       style="fill:#adf2ad;fill-opacity:1;stroke:#007200;stroke-opacity:1" />
+     transform="translate(60,20)"
+     id="g4303">
+    <svg
+       width="10"
+       height="10"
+       id="svg4305"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-140,-20)"
+         d="m 140.45,20.467 v 9.0791 h 5.3718 l 3.5813,-4.54 -3.5813,-4.5391 z"
+         id="path4307"
+         inkscape:connector-curvature="0"
+         style="fill:#ef9d0d;stroke:#a36c01;stroke-width:0.90799999" />
+    </svg>
   </g>
   <g
-     id="g1843-3"
-     transform="matrix(0.29355874,0,0,0.29090916,62.650463,26.863632)"
-     style="fill:#acf2ae;fill-opacity:1;stroke:#007200;stroke-width:2.57672915;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">
-    <path
-       style="fill:#acf2ae;fill-opacity:1;stroke:#007200;stroke-width:2.57672915;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       inkscape:connector-curvature="0"
-       id="path3723-6"
-       d="m 144.95034,9.9996995 c -2.75983,-0.03 -4.9797,-2.2899 -4.9497,-5.0497 0.03,-2.7598 2.28986,-4.97969998 5.0497,-4.94969997795 2.75983,0.0299999979 4.9797,2.28989997795 4.9497,5.04969997795 -0.03,2.7598 -2.28986,4.9797005 -5.0497,4.9497 z" />
-    <path
-       style="fill:#acf2ae;fill-opacity:1;stroke:#007200;stroke-width:2.57672915;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       inkscape:connector-curvature="0"
-       id="path3725-0"
-       d="m 149.50007,5.0499995 c -0.03,2.4898 -2.05988,4.4797 -4.54973,4.4497 -2.48985,-0.03 -4.47973,-2.0598 -4.44973,-4.5497 0.03,-2.4898 2.05988,-4.47969998 4.54973,-4.44969998 2.48985,0.03 4.47973,2.05979998 4.44973,4.54969998 z" />
-  </g>
-  <path
-     style="fill:#acf2ae;fill-opacity:1;stroke:#007200;stroke-width:0.753;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     inkscape:connector-curvature="0"
-     id="path3725-0-1"
-     d="m 6.537512,8.5145412 c -0.0088,0.724306 -0.604696,1.303186 -1.335613,1.294459 -0.730917,-0.0087 -1.315064,-0.599215 -1.306257,-1.32355 0.0088,-0.724305 0.604695,-1.303185 1.335613,-1.294458 0.730917,0.0087 1.315063,0.599215 1.306257,1.323549 z" />
-  <g
-     id="g3426-8"
-     transform="matrix(0,-0.67745118,-0.62037003,0,120.71948,148.46483)"
-     style="fill:#adf2ad;fill-opacity:1;stroke:#007200;stroke-width:1.31578407;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none">
-    <path
-       sodipodi:nodetypes="cccccccc"
-       inkscape:connector-curvature="0"
-       id="path3428-7"
-       d="m 186,20 -5,5 5,5 0,-2 3,0 0,-6 -3.0004,0 z"
-       style="fill:#adf2ad;fill-opacity:1;stroke:#007200;stroke-width:1.31578407;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
+     transform="translate(60,40)"
+     id="g4309">
+    <svg
+       width="10"
+       height="10"
+       id="svg4311"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-160,0)"
+         d="m 165,10 c -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 0,2.76 -2.24,5 -5,5 z"
+         id="path4313"
+         inkscape:connector-curvature="0"
+         style="fill:#e5a600" />
+      <path
+         transform="translate(-160,0)"
+         d="m 169.5,5 c 0,2.49 -2.01,4.5 -4.5,4.5 -2.49,0 -4.5,-2.01 -4.5,-4.5 0,-2.49 2.01,-4.5 4.5,-4.5 2.49,0 4.5,2.01 4.5,4.5 z"
+         id="path4315"
+         inkscape:connector-curvature="0"
+         style="fill:#ffbd00" />
+      <path
+         transform="translate(-160,0)"
+         d="m 165.03,0.53 c 1.97,0 3.56,1.02 3.56,2.28 0,1.26 -1.59,2.28 -3.56,2.28 -1.97,0 -3.56,-1.02 -3.56,-2.28 0,-1.26 1.59,-2.28 3.56,-2.28 z"
+         id="path4317"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite12_a)" />
+      <path
+         transform="translate(-160,0)"
+         d="m 164.99,9.42 c 1.66,0 3,-0.71 3,-1.59 0,-0.88 -1.34,-1.59 -3,-1.59 -1.66,0 -3,0.71 -3,1.59 0,0.88 1.34,1.59 3,1.59 z"
+         id="path4319"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite12_b)" />
+      <defs
+         id="defs4321">
+        <linearGradient
+           id="sprite12_l">
+          <stop
+             stop-color="#ffa801"
+             stop-opacity="0"
+             offset="0"
+             id="stop4324" />
+          <stop
+             stop-color="#f0fb3d"
+             offset="1"
+             id="stop4326" />
+        </linearGradient>
+        <linearGradient
+           id="sprite12_m">
+          <stop
+             stop-color="#ffbd00"
+             stop-opacity=".65"
+             offset="0"
+             id="stop4329" />
+          <stop
+             stop-color="#fff"
+             stop-opacity=".91"
+             offset="1"
+             id="stop4331" />
+        </linearGradient>
+        <linearGradient
+           id="sprite12_b"
+           x1="227.88"
+           x2="235.12"
+           y1="103.16"
+           y2="103.16"
+           gradientTransform="matrix(0,0.43966,0.78049,0,84.444,-93.924)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite12_l" />
+        <linearGradient
+           id="sprite12_a"
+           x1="227.88"
+           x2="235.12"
+           y1="103.16"
+           y2="103.16"
+           gradientTransform="matrix(0,-0.62931,0.92683,0,69.47,148.53)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite12_m" />
+      </defs>
+    </svg>
   </g>
   <g
-     id="g3426-8-9"
-     transform="matrix(0,0.67745118,0.62037003,0,-10.29902,-122.10121)"
-     style="fill:#adf2ad;fill-opacity:1;stroke:#007200;stroke-width:1.3157841;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">
-    <path
-       sodipodi:nodetypes="cccccccc"
-       inkscape:connector-curvature="0"
-       id="path3428-7-2"
-       d="m 186,20 -5,5 5,5 0,-2 3,0 0,-6 -3.0004,0 z"
-       style="fill:#adf2ad;fill-opacity:1;stroke:#007200;stroke-width:1.3157841;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+     transform="translate(0,60)"
+     id="g4335">
+    <svg
+       width="10"
+       height="10"
+       id="svg4337"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-120,0)"
+         d="m 125,10 c -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 0,2.76 -2.24,5 -5,5 z"
+         id="path4339"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite13_a)" />
+      <path
+         transform="translate(-120,0)"
+         d="m 129.5,5 c 0,2.49 -2.01,4.5 -4.5,4.5 -2.49,0 -4.5,-2.01 -4.5,-4.5 0,-2.49 2.01,-4.5 4.5,-4.5 2.49,0 4.5,2.01 4.5,4.5 z"
+         id="path4341"
+         inkscape:connector-curvature="0"
+         style="fill:#dd0000" />
+      <path
+         transform="translate(-120,0)"
+         d="m 125.03,0.53 c 1.97,0 3.56,1.02 3.56,2.28 0,1.26 -1.59,2.28 -3.56,2.28 -1.97,0 -3.56,-1.02 -3.56,-2.28 0,-1.26 1.59,-2.28 3.56,-2.28 z"
+         id="path4343"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite13_b)" />
+      <path
+         transform="translate(-120,0)"
+         d="m 125.03,9.47 c 1.66,0 3,-0.71 3,-1.59 0,-0.88 -1.34,-1.59 -3,-1.59 -1.66,0 -3,0.71 -3,1.59 0,0.88 1.34,1.59 3,1.59 z"
+         id="path4345"
+         inkscape:connector-curvature="0"
+         style="fill:url(#sprite13_c)" />
+      <defs
+         id="defs4347">
+        <linearGradient
+           id="sprite13_g">
+          <stop
+             stop-color="red"
+             stop-opacity="0"
+             offset="0"
+             id="stop4350" />
+          <stop
+             stop-color="#f0cb68"
+             stop-opacity=".71"
+             offset="1"
+             id="stop4352" />
+        </linearGradient>
+        <linearGradient
+           id="sprite13_h">
+          <stop
+             stop-color="#e60000"
+             stop-opacity=".65"
+             offset="0"
+             id="stop4355" />
+          <stop
+             stop-color="#fff"
+             stop-opacity=".91"
+             offset="1"
+             id="stop4357" />
+        </linearGradient>
+        <linearGradient
+           id="sprite13_i">
+          <stop
+             stop-color="#a10000"
+             offset="0"
+             id="stop4360" />
+          <stop
+             stop-color="#c60000"
+             offset="1"
+             id="stop4362" />
+        </linearGradient>
+        <linearGradient
+           id="sprite13_c"
+           x1="227.88"
+           x2="235.12"
+           y1="103.16"
+           y2="103.16"
+           gradientTransform="matrix(0,0.43966,0.78049,0,44.488,-93.88)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite13_g" />
+        <linearGradient
+           id="sprite13_b"
+           x1="227.88"
+           x2="235.12"
+           y1="103.16"
+           y2="103.16"
+           gradientTransform="matrix(0,-0.62931,0.92683,0,29.47,148.53)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite13_h" />
+        <linearGradient
+           id="sprite13_a"
+           x1="227.88"
+           x2="235.12"
+           y1="103.16"
+           y2="103.16"
+           gradientTransform="matrix(0,1.3793,-1.3008,0,259.08,-314.35)"
+           gradientUnits="userSpaceOnUse"
+           xlink:href="#sprite13_i" />
+      </defs>
+    </svg>
+  </g>
+  <g
+     transform="translate(20,60)"
+     id="g4367">
+    <svg
+       width="10"
+       height="10"
+       id="svg4369"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-60,-20)"
+         d="M 60,20 H 70 V 30 H 60 z"
+         id="path4371"
+         inkscape:connector-curvature="0"
+         style="fill:none" />
+      <path
+         transform="translate(-60,-20)"
+         d="M 67.5,22.5 V 20 H 60 v 7.5 h 2.5 V 30 H 70 V 22.5 z M 61,21 h 5.5 v 5.5 H 61 z m 2.5,6.5 h 4 v -4 H 69 V 29 h -5.5 z"
+         id="path4373"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 3.5,7.5 h 4 v -4 H 9 V 9 H 3.5 z"
+         id="path4375"
+         inkscape:connector-curvature="0"
+         style="fill-opacity:0.25" />
+    </svg>
+  </g>
+  <g
+     transform="translate(40,60)"
+     id="g4377">
+    <svg
+       width="10"
+       height="10"
+       id="svg4379"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g4381"
+         style="stroke:#007200">
+        <g
+           id="g4383"
+           style="fill:#acf2ae;stroke-width:2.5769999">
+          <path
+             transform="matrix(0.29356,0,0,0.2909,-37.35,6.864)"
+             d="m 144.95,9.9997 c -2.7598,-0.03 -4.9797,-2.2899 -4.9497,-5.0497 0.03,-2.7598 2.2899,-4.9797 5.0497,-4.9497 2.7598,0.03 4.9797,2.2899 4.9497,5.0497 -0.03,2.7598 -2.2899,4.9797 -5.0497,4.9497 z"
+             id="path4385"
+             inkscape:connector-curvature="0" />
+          <path
+             transform="matrix(0.29356,0,0,0.2909,-37.35,6.864)"
+             d="m 149.5,5.05 c -0.03,2.4898 -2.0599,4.4797 -4.5497,4.4497 -2.4898,-0.03 -4.4797,-2.0598 -4.4497,-4.5497 0.03,-2.4898 2.0599,-4.4797 4.5497,-4.4497 2.4898,0.03 4.4797,2.0598 4.4497,4.5497 z"
+             id="path4387"
+             inkscape:connector-curvature="0" />
+        </g>
+        <path
+           transform="matrix(0,-0.67745,-0.62037,0,20.72,128.46)"
+           d="m 186,20 -5,5 5,5 v -2 h 3 v -6 h -3.0004 z"
+           id="path4389"
+           inkscape:connector-curvature="0"
+           style="fill:#adf2ad;stroke-width:1.31599998" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(60,60)"
+     id="g4391">
+    <svg
+       width="10"
+       height="10"
+       id="svg4393"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <g
+         id="g4395"
+         style="stroke:#007200">
+        <path
+           d="M 6.5375,8.5145 C 6.5287,9.23881 5.9328,9.8177 5.2019,9.809 4.47098,9.8003 3.8868,9.20978 3.8956,8.4854 3.9044,7.7611 4.5003,7.1822 5.2312,7.1909 5.96212,7.1996 6.5463,7.79012 6.5375,8.5144 z"
+           id="path4397"
+           inkscape:connector-curvature="0"
+           style="fill:#acf2ae;stroke-width:0.75300002" />
+        <path
+           transform="matrix(0,0.67745,0.62037,0,-10.299,-122.1)"
+           d="m 186,20 -5,5 5,5 v -2 h 3 v -6 h -3.0004 z"
+           id="path4399"
+           inkscape:connector-curvature="0"
+           style="fill:#adf2ad;stroke-width:1.31599998" />
+      </g>
+    </svg>
+  </g>
+  <g
+     transform="translate(80,0)"
+     id="g4401">
+    <svg
+       width="10"
+       height="10"
+       id="svg4403"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-20,-20)"
+         d="m 23.25,21.75 3.5,3.25 -3.5,3.25"
+         id="path4405"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#367cf1;stroke-width:1.5" />
+    </svg>
+  </g>
+  <g
+     transform="translate(80,20)"
+     id="g4407">
+    <svg
+       width="10"
+       height="10"
+       id="svg4409"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-180,-20)"
+         d="m 186,20 -5,5 5,5 v -2 h 3 v -6 h -3 z"
+         id="path4411"
+         inkscape:connector-curvature="0"
+         style="fill:#4688f1" />
+    </svg>
+  </g>
+  <g
+     transform="translate(80,40)"
+     id="g4413">
+    <svg
+       width="10"
+       height="10"
+       id="svg4415"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="matrix(-1,0,0,1,190,-19.955)"
+         d="m 186,20 -5,5 5,5 v -2 h 3 v -6 h -3 z"
+         id="path4417"
+         inkscape:connector-curvature="0"
+         style="fill:#4688f1" />
+    </svg>
+  </g>
+  <g
+     transform="translate(80,60)"
+     id="g4419">
+    <svg
+       width="10"
+       height="10"
+       id="svg4421"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-20,-98)"
+         d="m 24,106 4,-7 h -8"
+         id="path4423"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(0,80)"
+     id="g4425">
+    <svg
+       width="10"
+       height="10"
+       id="svg4427"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-4,-98)"
+         d="M 12,102 5,98 v 8"
+         id="path4429"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(20,80)"
+     id="g4431">
+    <svg
+       width="10"
+       height="10"
+       id="svg4433"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-4,-111)"
+         d="m 8,111 4,7 H 4"
+         id="path4435"
+         inkscape:connector-curvature="0" />
+    </svg>
+  </g>
+  <g
+     transform="translate(40,80)"
+     id="g4437">
+    <svg
+       width="10"
+       height="10"
+       id="svg4439"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(0,-19)"
+         d="m 3.2503,21.75 3.5,3.25 -3.5,3.25"
+         id="path4441"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#939393;stroke-width:1.5" />
+    </svg>
+  </g>
+  <g
+     transform="translate(60,80)"
+     id="g4443">
+    <svg
+       width="10"
+       height="10"
+       id="svg4445"
+       version="1.1"
+       inkscape:version="0.48.4 r9939">
+      <path
+         transform="translate(-60,0)"
+         d="m 61,9 4,-8 4,8 z"
+         id="path4447"
+         inkscape:connector-curvature="0"
+         style="stroke:#c19600;stroke-width:2;stroke-linejoin:round" />
+      <path
+         transform="translate(-60,0)"
+         d="m 61,9 4,-8 4,8 z"
+         id="path4449"
+         inkscape:connector-curvature="0"
+         style="fill:#f4bd00;stroke:#f5bd00;stroke-width:1.5;stroke-linejoin:round" />
+      <path
+         transform="translate(-60,0)"
+         d="m 63.75,2.75 h 2.5 v 2.5 L 65.75,7 h -1.5 l -0.5,-1.75 v -2.5 m 0,5.25 h 2.5 v 1.25 h -2.5"
+         id="path4451"
+         inkscape:connector-curvature="0"
+         style="fill:#ad8601" />
+      <path
+         transform="translate(-60,0)"
+         d="m 64,3 h 2 V 5.25 L 65.5,7 h -1 L 64,5.25 V 3 m 0,5 h 2 v 1 h -2"
+         id="path4453"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff" />
+    </svg>
   </g>
 </svg>
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
index e7f5a8d0..28b1eae 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
@@ -1,11 +1,11 @@
 {
     "securityIcons.svg": "27676f7c1f1542659c7c49a8052259dc",
-    "resourceGlyphs.svg": "ae5287ef4b10714c8858b5384c348b6a",
+    "largeIcons.svg": "08de0833433a45e705d88d1c9d9b145a",
     "breakpointConditional.svg": "4cf90210b2af2ed84db2f60b07bcde28",
     "checkboxCheckmark.svg": "f039bf85cee42ad5c30ca3bfdce7912a",
     "errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45",
-    "smallIcons.svg": "dfe3f6ca301f216b4cf881e10a739242",
-    "toolbarButtonGlyphs.svg": "881d1dfc706b546cfc79fa33045ff548",
+    "smallIcons.svg": "b11032f745140459cb066768b1ca514c",
+    "mediumIcons.svg": "83fe8b7d7cd399a48c70677a25aecfab",
     "breakpoint.svg": "69cd92d807259c022791112809b97799",
     "treeoutlineTriangles.svg": "017d2f89437df0afc6b9cd5ff43735d9",
     "audits_logo_bw.svg": "203dcb2ba32ef0f4595ad45bb8feffab",
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/toolbarButtonGlyphs.svg b/third_party/WebKit/Source/devtools/front_end/Images/src/toolbarButtonGlyphs.svg
deleted file mode 100644
index 96e4f846..0000000
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/toolbarButtonGlyphs.svg
+++ /dev/null
@@ -1,1281 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   height="168"
-   version="1.1"
-   width="352"
-   xml:space="preserve"
-   id="svg3395"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="toolbarButtonGlyphs.svg"><metadata
-     id="metadata3773"><rdf:RDF><cc:Work
-         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
-     showgrid="true"
-     id="namedview3397"
-     inkscape:zoom="4"
-     inkscape:cx="182.22277"
-     inkscape:cy="90.232966"
-     inkscape:window-width="2560"
-     inkscape:window-height="1547"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg3395"
-     inkscape:snap-global="true"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:snap-grids="true"><inkscape:grid
-       dotted="false"
-       empspacing="2"
-       enabled="true"
-       id="grid3327"
-       snapvisiblegridlinesonly="true"
-       spacingx="32"
-       spacingy="24"
-       type="xygrid"
-       visible="true"
-       originx="0"
-       originy="0" /></sodipodi:namedview><defs
-     id="defs3400"><inkscape:path-effect
-       effect="skeletal"
-       id="path-effect3658"
-       is_visible="true"
-       pattern="M 0,0 0,10 10,5 z"
-       copytype="single_stretched"
-       prop_scale="1"
-       scale_y_rel="false"
-       spacing="0"
-       normal_offset="0"
-       tang_offset="0"
-       prop_units="false"
-       vertical_pattern="false"
-       fuse_tolerance="0" /><inkscape:path-effect
-       effect="skeletal"
-       id="path-effect3654"
-       is_visible="true"
-       pattern="M 0,0 0,10 10,5 z"
-       copytype="single_stretched"
-       prop_scale="1"
-       scale_y_rel="false"
-       spacing="0"
-       normal_offset="0"
-       tang_offset="0"
-       prop_units="false"
-       vertical_pattern="false"
-       fuse_tolerance="0" /><linearGradient
-       id="a"><stop
-         offset="0"
-         stop-color="#606eda"
-         id="stop3403" /><stop
-         offset="1"
-         stop-color="#021db2"
-         id="stop3405" /></linearGradient><linearGradient
-       id="b"><stop
-         offset="0"
-         stop-color="#e59290"
-         id="stop3408" /><stop
-         offset="1"
-         stop-color="#e99890"
-         id="stop3410" /></linearGradient><linearGradient
-       id="c"><stop
-         offset="0"
-         stop-color="#c0544f"
-         id="stop3413" /><stop
-         offset="1"
-         stop-color="#d08481"
-         id="stop3415" /></linearGradient><linearGradient
-       id="d"><stop
-         offset="0"
-         stop-color="#ffa801"
-         stop-opacity="0"
-         id="stop3418" /><stop
-         offset="1"
-         stop-color="#f0fb3d"
-         id="stop3420" /></linearGradient><linearGradient
-       id="e"><stop
-         offset="0"
-         stop-color="#ffbd00"
-         stop-opacity="0.65"
-         id="stop3423" /><stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0.91"
-         id="stop3425" /></linearGradient><linearGradient
-       id="f"><stop
-         offset="0"
-         stop-color="#00d600"
-         stop-opacity="0"
-         id="stop3428" /><stop
-         offset="1"
-         stop-color="#d8fc7b"
-         stop-opacity="0.81"
-         id="stop3430" /></linearGradient><linearGradient
-       id="g"><stop
-         offset="0"
-         stop-color="#00ba00"
-         id="stop3433" /><stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0.91"
-         id="stop3435" /></linearGradient><linearGradient
-       id="h"><stop
-         offset="0"
-         stop-color="#00a104"
-         id="stop3438" /><stop
-         offset="1"
-         stop-color="#00c605"
-         id="stop3440" /></linearGradient><linearGradient
-       id="i"><stop
-         offset="0"
-         stop-color="#f00"
-         stop-opacity="0"
-         id="stop3443" /><stop
-         offset="1"
-         stop-color="#f0cb68"
-         stop-opacity="0.71"
-         id="stop3445" /></linearGradient><linearGradient
-       id="j"><stop
-         offset="0"
-         stop-color="#e60000"
-         stop-opacity="0.65"
-         id="stop3448" /><stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0.91"
-         id="stop3450" /></linearGradient><linearGradient
-       id="k"><stop
-         offset="0"
-         stop-color="#a10000"
-         id="stop3453" /><stop
-         offset="1"
-         stop-color="#c60000"
-         id="stop3455" /></linearGradient><linearGradient
-       id="l"><stop
-         offset="0"
-         stop-color="#d7687d"
-         id="stop3458" /><stop
-         offset="1"
-         stop-color="#b21402"
-         id="stop3460" /></linearGradient><radialGradient
-       cx="0"
-       cy="0"
-       fx="0"
-       fy="0"
-       gradientTransform="matrix(18,0,0,-18,680,341)"
-       gradientUnits="userSpaceOnUse"
-       id="z"
-       r="1"
-       spreadMethod="pad"><stop
-         offset="0"
-         id="stop3463" /><stop
-         offset="1"
-         stop-opacity="0"
-         id="stop3465" /></radialGradient><radialGradient
-       cx="0"
-       cy="0"
-       fx="0"
-       fy="0"
-       gradientTransform="matrix(9,0,0,9,304,36)"
-       gradientUnits="userSpaceOnUse"
-       id="A"
-       r="1"
-       spreadMethod="pad"
-       xlink:href="#z" /><linearGradient
-       gradientTransform="matrix(0,-0.58333333,-0.58333333,0,118,110)"
-       gradientUnits="userSpaceOnUse"
-       id="m"
-       x1="0"
-       x2="24"
-       xlink:href="#l"
-       y1="0"
-       y2="0" /><linearGradient
-       gradientTransform="matrix(0,1,-1,0,206,0)"
-       gradientUnits="userSpaceOnUse"
-       id="n"
-       x1="96.5"
-       x2="109.5"
-       xlink:href="#b"
-       y1="103"
-       y2="103" /><linearGradient
-       gradientTransform="matrix(0,1,-1,0,207,-17)"
-       gradientUnits="userSpaceOnUse"
-       id="o"
-       x1="113"
-       x2="127"
-       xlink:href="#c"
-       y1="104"
-       y2="104" /><linearGradient
-       gradientTransform="matrix(0,-0.41666666,-0.41666666,0,218,106)"
-       gradientUnits="userSpaceOnUse"
-       id="p"
-       x1="0"
-       x2="24"
-       xlink:href="#l"
-       y1="0"
-       y2="0" /><linearGradient
-       gradientTransform="matrix(0.71428571,0,0,0.71428571,132.28571,37.714287)"
-       gradientUnits="userSpaceOnUse"
-       id="q"
-       x1="113"
-       x2="127"
-       xlink:href="#a"
-       y1="104"
-       y2="104" /><linearGradient
-       gradientTransform="matrix(0,1.3793103,-1.3008129,0,363.08462,-218.35335)"
-       gradientUnits="userSpaceOnUse"
-       id="r"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#k"
-       y1="103.15625"
-       y2="103.15625" /><linearGradient
-       gradientTransform="matrix(0,-0.62931035,0.92682926,0,133.46895,244.52849)"
-       gradientUnits="userSpaceOnUse"
-       id="s"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#j"
-       y1="103.15625"
-       y2="103.15625" /><linearGradient
-       gradientTransform="matrix(0,0.43965518,0.78048781,0,148.48744,2.1206316)"
-       gradientUnits="userSpaceOnUse"
-       id="t"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#i"
-       y1="103.15625"
-       y2="103.15625" /><linearGradient
-       gradientTransform="matrix(-0.01506784,1.3792098,-1.3007182,-0.01421029,377.66542,-216.8212)"
-       gradientUnits="userSpaceOnUse"
-       id="u"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#h"
-       y1="103.15625"
-       y2="103.15625" /><linearGradient
-       gradientTransform="matrix(0.00687469,-0.62926454,0.92676181,0.01012483,142.86511,243.44332)"
-       gradientUnits="userSpaceOnUse"
-       id="v"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#g"
-       y1="103.15625"
-       y2="103.15625" /><linearGradient
-       gradientTransform="matrix(-0.00480288,0.43962318,0.780431,0.00852617,160.60265,1.1603253)"
-       gradientUnits="userSpaceOnUse"
-       id="w"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#f"
-       y1="103.15625"
-       y2="103.15625" /><linearGradient
-       gradientTransform="matrix(0,-0.62931035,0.92682926,0,155.46895,244.52849)"
-       gradientUnits="userSpaceOnUse"
-       id="x"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#e"
-       y1="103.15625"
-       y2="103.15625" /><linearGradient
-       gradientTransform="matrix(0,0.43965518,0.78048781,0,170.44325,2.076437)"
-       gradientUnits="userSpaceOnUse"
-       id="y"
-       x1="227.875"
-       x2="235.125"
-       xlink:href="#d"
-       y1="103.15625"
-       y2="103.15625" /><linearGradient
-       inkscape:collect="always"
-       xlink:href="#l-0"
-       id="linearGradient3239"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0,-0.41666666,-0.41666666,0,249.99999,117)"
-       x1="0"
-       y1="0"
-       x2="24"
-       y2="0" /><linearGradient
-       id="l-0"><stop
-         offset="0"
-         stop-color="#d7687d"
-         id="stop3458-8" /><stop
-         offset="1"
-         stop-color="#b21402"
-         id="stop3460-8" /></linearGradient><linearGradient
-       gradientTransform="matrix(0,1,-1,0,206,0)"
-       gradientUnits="userSpaceOnUse"
-       id="n-3"
-       x1="96.5"
-       x2="109.5"
-       xlink:href="#b-6"
-       y1="103"
-       y2="103" /><linearGradient
-       id="b-6"><stop
-         offset="0"
-         stop-color="#e59290"
-         id="stop3408-7" /><stop
-         offset="1"
-         stop-color="#e99890"
-         id="stop3410-5" /></linearGradient><linearGradient
-       gradientTransform="matrix(0,1,-1,0,207,-17)"
-       gradientUnits="userSpaceOnUse"
-       id="o-3"
-       x1="113"
-       x2="127"
-       xlink:href="#c-5"
-       y1="104"
-       y2="104" /><linearGradient
-       id="c-5"><stop
-         offset="0"
-         stop-color="#c0544f"
-         id="stop3413-6" /><stop
-         offset="1"
-         stop-color="#d08481"
-         id="stop3415-2" /></linearGradient><linearGradient
-       gradientTransform="matrix(0,-0.58333333,-0.58333333,0,118,110)"
-       gradientUnits="userSpaceOnUse"
-       id="m-9"
-       x1="0"
-       x2="24"
-       xlink:href="#l-1"
-       y1="0"
-       y2="0" /><linearGradient
-       id="l-1"><stop
-         offset="0"
-         stop-color="#d7687d"
-         id="stop3458-2" /><stop
-         offset="1"
-         stop-color="#b21402"
-         id="stop3460-7" /></linearGradient><linearGradient
-       y2="0"
-       x2="24"
-       y1="0"
-       x1="0"
-       gradientTransform="matrix(0,-0.58333333,-0.58333333,0,118,110)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3620"
-       xlink:href="#l-1"
-       inkscape:collect="always" /></defs><g
-     id="g2194"><path
-       inkscape:connector-curvature="0"
-       id="path3481"
-       d="M 57,12 53.5,8 39,8 l 0,8 14.5,0" /></g><g
-     id="g2283"><path
-       inkscape:connector-curvature="0"
-       id="path3483"
-       d="M 25,36 21.36,32 19.57,32 14,40 21.36,40 25,36 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3485"
-       d="M 7,32 7,40 9.05,40 14,32 7,32 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3487"
-       d="M 9.67,44.55 8.08,43.23 18.84,27.45 20.43,28.77 9.67,44.55 z" /></g><g
-     id="g2278"><path
-       inkscape:connector-curvature="0"
-       id="path3491"
-       d="m 53,37 -10,0 0,-5 10,0 0,5 z m -12,5 14,0 0,-12 -14,0 0,12 z" /></g><g
-     id="g2287"><path
-       inkscape:connector-curvature="0"
-       id="path3493"
-       d="m 10,57 -2,0 0,9 11,0 0,-2 -9,0 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3495"
-       d="m 13,56 7,0 0,5 -7,0 z m -2,-2 0,9 11,0 0,-9 z" /></g><g
-     id="g2197"><path
-       inkscape:connector-curvature="0"
-       id="path3505"
-       d="m 80.44,16.94 c -2.48,0 -4.5,-2.02 -4.5,-4.5 0,-0.88 0.26,-1.7 0.69,-2.39 l 6.2,6.2 c -0.69,0.44 -1.51,0.69 -2.39,0.69 m 4.5,-4.5 c 0,0.88 -0.26,1.7 -0.69,2.39 l -6.2,-6.2 c 0.69,-0.44 1.51,-0.69 2.39,-0.69 2.48,0 4.5,2.02 4.5,4.5 M 80.5,6 C 76.91,6 74,8.91 74,12.5 74,16.09 76.91,19 80.5,19 84.09,19 87,16.09 87,12.5 87,8.91 84.09,6 80.5,6" /></g><g
-     id="g2203"><path
-       inkscape:connector-curvature="0"
-       id="path3509"
-       d="M 149,8.33 147.67,7 144,10.67 140.33,7 139,8.33 142.67,12 139,15.67 140.33,17 144,13.33 147.67,17 149,15.67 145.33,12 149,8.33 z" /></g><g
-     id="g2291"><path
-       style="opacity:0.5;fill:#424242"
-       inkscape:connector-curvature="0"
-       id="path3511"
-       d="m 44,59 2,3 0,4 4,0 0,-4 2,-3 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3513"
-       d="m 46.5,65.23 c 0.32,0.13 0.84,0.24 1.47,0.24 0.59,0 1.14,-0.1 1.53,-0.26 l 0,-3.93 4,-4.57 0,-0.19 -11,0 0,0.22 4,4.57 0,3.93 z M 47.97,67 C 46.81,66.91 45.82,66.71 45,66.01 l 0,-4.12 -4,-4.57 0,-2.32 14,0 0,2.35 -4,4.57 0,4.13 c -0.92,0.67 -2.1,0.94 -3.03,0.95" /></g><g
-     id="g2294"><path
-       inkscape:connector-curvature="0"
-       id="path3515"
-       d="M 86,60 76,55 76,65" /></g><g
-     id="g2304"><path
-       style="opacity:0.2"
-       inkscape:connector-curvature="0"
-       id="path3517"
-       d="m 153,57 -11,0 0,-2 11,0 0,2 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3519"
-       d="m 142,57 -6,0 0,-2 6,0 0,2 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3521"
-       d="m 145,60 -6,0 0,-2 6,0 0,2 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3523"
-       d="m 150,63 -6,0 0,-2 6,0 0,2 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3525"
-       d="m 152,66 -6,0 0,-2 6,0 0,2 z" /></g><g
-     id="g2323"><path
-       inkscape:connector-curvature="0"
-       id="path3553"
-       d="m 274,64 -7,0 0,-8 7,0 0,8 z m -9,2 14,0 0,-12 -14,0 0,12 z" /></g><g
-     id="g2220"><path
-       inkscape:connector-curvature="0"
-       id="path3555"
-       d="m 298,12 c 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 0,-3.31 -2.69,-6 -6,-6 -3.31,0 -6,2.69 -6,6" /></g><g
-     id="g2241"><path
-       style="fill:url(#A)"
-       inkscape:connector-curvature="0"
-       id="path3557"
-       d="m 295,36 c 0,4.97 4.03,9 9,9 l 0,0 c 4.97,0 9,-4.03 9,-9 l 0,0 c 0,-4.97 -4.03,-9 -9,-9 l 0,0 c -4.97,0 -9,4.03 -9,9" /><path
-       inkscape:connector-curvature="0"
-       id="path3559"
-       d="m 298,36 c 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 0,-3.31 -2.69,-6 -6,-6 -3.31,0 -6,2.69 -6,6" /></g><g
-     id="g2214"><path
-       inkscape:connector-curvature="0"
-       id="path3567"
-       d="m 237,11 -4,0 0,-4 4,0 0,4 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3569"
-       d="m 247,9 -9,0 0,-2 9,0 0,2 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3571"
-       d="m 247,11 -9,0 0,-1 9,0 0,1 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3573"
-       d="m 247,15 -9,0 0,-2 9,0 0,2 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3575"
-       d="m 237,17 -4,0 0,-4 4,0 0,4 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3577"
-       d="m 247,17 -9,0 0,-1 9,0 0,1 z" /></g><g
-     id="g2245"><path
-       inkscape:connector-curvature="0"
-       id="path3581"
-       d="m 268.01,35.99 c 0.61,0.28 1.07,0.9 1.07,1.58 0.11,0.85 -0.05,1.72 0.12,2.57 0.27,0.54 1,0.28 1.43,0.55 0.49,0.24 0.48,1.01 -0.06,1.18 -0.56,0.22 -1.18,0.08 -1.74,-0.05 -0.71,-0.2 -1.41,-0.72 -1.5,-1.5 -0.18,-0.89 0.01,-1.8 -0.16,-2.68 -0.22,-0.64 -0.94,-0.9 -1.57,-0.93 -0.58,-0.1 -0.83,-0.94 -0.35,-1.3 0.51,-0.35 1.26,-0.14 1.69,-0.66 0.44,-0.48 0.29,-1.18 0.32,-1.78 0,-0.81 -0.02,-1.77 0.65,-2.34 0.66,-0.54 1.58,-0.71 2.41,-0.63 0.63,0 0.98,0.87 0.4,1.22 -0.44,0.37 -1.2,0.06 -1.51,0.65 -0.14,0.56 -0.05,1.15 -0.07,1.73 -0.01,0.75 -0.05,1.64 -0.72,2.13 -0.12,0.1 -0.26,0.19 -0.4,0.26" /><path
-       inkscape:connector-curvature="0"
-       id="path3583"
-       d="m 276.98,35.99 c -0.67,-0.3 -1.08,-1.02 -1.08,-1.75 -0.07,-0.76 0.03,-1.52 -0.06,-2.28 -0.24,-0.58 -0.98,-0.4 -1.46,-0.59 -0.59,-0.24 -0.48,-1.18 0.14,-1.31 0.73,-0.15 1.52,-0.01 2.18,0.32 0.56,0.28 0.95,0.86 0.99,1.48 0.13,0.83 -0.03,1.68 0.13,2.5 0.2,0.68 0.94,0.83 1.54,0.9 0.56,0.07 0.86,0.8 0.46,1.21 -0.44,0.46 -1.2,0.2 -1.65,0.66 -0.51,0.46 -0.4,1.21 -0.4,1.83 -0.03,0.78 0.06,1.69 -0.52,2.3 -0.74,0.65 -1.8,0.86 -2.75,0.68 -0.52,-0.16 -0.69,-1.01 -0.15,-1.25 0.44,-0.23 1.02,-0.08 1.41,-0.45 0.26,-0.45 0.09,-0.98 0.14,-1.47 0.01,-0.76 -0.07,-1.63 0.43,-2.26 0.18,-0.21 0.42,-0.37 0.66,-0.51" /></g><g
-     id="g2217"><path
-       inkscape:connector-curvature="0"
-       id="path3585"
-       d="m 275,15 -2,0 0,-6 2,0 z m -4,0 -2,0 0,-6 2,0 z m 4,-10 -6,0 -4,4 0,6 4,4 6,0 4,-4.12 0,-5.88 z" /></g><g
-     id="g2263"><path
-       inkscape:connector-curvature="0"
-       id="path3591"
-       d="m 139.5,33 9,0 -1.5,10 -6,0" /><path
-       inkscape:connector-curvature="0"
-       id="path3593"
-       d="m 147.5,30 -2,0 0,-1 -3,0 0,1 -2,0 c -0.55,0 -1,0.48 -1,1 l 0,1 1,0 7,0 1,0 0,-1 c 0,-0.52 -0.45,-1 -1,-1" /></g><g
-     id="g2234"><path
-       inkscape:connector-curvature="0"
-       id="path3595"
-       d="m 317,69 0,-5 -5,5 5,0 z" /></g><g
-     id="g2358"><path
-       inkscape:connector-curvature="0"
-       id="path3597"
-       d="m 23,84 -8,-5 0,10" /><path
-       inkscape:connector-curvature="0"
-       id="path3599"
-       d="m 13,89 -3,0 0,-10 3,0 0,10 z" /></g><g
-     id="g2354"><path
-       inkscape:connector-curvature="0"
-       id="path3601"
-       d="m 47,88 -3,0 0,-8 3,0 0,8 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3603"
-       d="m 53,88 -3,0 0,-8 3,0 0,8 z" /></g><g
-     id="g2350"><path
-       inkscape:connector-curvature="0"
-       id="path3605"
-       d="m 78.5,89 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" /><path
-       inkscape:connector-curvature="0"
-       id="path3607"
-       d="m 79,78 0,4 -3,0 4.5,4 4.5,-4 -3,0 0,-4 -3,0 z" /></g><g
-     id="g2346"><path
-       inkscape:connector-curvature="0"
-       id="path3609"
-       d="m 110.5,89 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" /><path
-       inkscape:connector-curvature="0"
-       id="path3611"
-       d="m 112.5,78 -4.5,4 3,0 0,4 3,0 0,-4 3,0 -4.5,-4 z" /></g><g
-     id="g2342"><path
-       inkscape:connector-curvature="0"
-       id="path3613"
-       d="m 142,86.5 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" /><path
-       style="fill:none;stroke:#000000;stroke-width:2.5"
-       inkscape:connector-curvature="0"
-       id="path3615"
-       d="m 137.25,87.03 c 2.55,-8.43 11.4,-8.73 13.94,0" /><path
-       inkscape:connector-curvature="0"
-       id="path3617"
-       d="m 151.68,89 -4.54,-2.76 6.68,-2.1" /></g><g
-     id="g2361"><path
-       inkscape:connector-curvature="0"
-       id="path3619"
-       d="m 12,102 -7,-4 0,8" /></g><path
-     d="m 24,106 4,-7 -8,0"
-     id="path3621"
-     inkscape:connector-curvature="0" /><path
-     d="m 8,111 4,7 -8,0"
-     id="path3623"
-     inkscape:connector-curvature="0" /><g
-     id="g2337"><rect
-       style="fill:none;stroke:#000000"
-       id="rect3629"
-       y="78.5"
-       x="168.5"
-       width="14"
-       height="12" /><path
-       inkscape:connector-curvature="0"
-       id="path3631"
-       d="m 180,84.5 -5,-3.25 0,6.5" /><rect
-       id="rect3633"
-       y="78"
-       x="172"
-       width="1"
-       height="13" /></g><g
-     id="g2332"><rect
-       style="fill:none;stroke:#000000"
-       id="rect3635"
-       y="78.5"
-       x="200.5"
-       width="14"
-       height="12" /><path
-       inkscape:connector-curvature="0"
-       id="path3637"
-       d="m 207,84.5 5,-3.25 0,6.5" /><rect
-       id="rect3639"
-       y="78"
-       x="204"
-       width="1"
-       height="13" /></g><g
-     id="g2414"><path
-       style="fill:#bebebe"
-       inkscape:connector-curvature="0"
-       id="path3673"
-       d="m 143,102.5 c 0,3.59 2.91,6.5 6.5,6.5 3.59,0 6.5,-2.91 6.5,-6.5 0,-3.59 -2.91,-6.5 -6.5,-6.5 -3.59,0 -6.5,2.91 -6.5,6.5" /><path
-       style="fill-opacity:0.37000002"
-       inkscape:connector-curvature="0"
-       id="path3675"
-       d="m 153,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /><path
-       style="fill:#ffffff"
-       inkscape:connector-curvature="0"
-       id="path3677"
-       d="M 153,99.93 152.07,99 149.5,101.57 146.93,99 146,99.93 l 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /></g><g
-     id="g2419"><path
-       style="fill:#9f9f9f"
-       inkscape:connector-curvature="0"
-       id="path3679"
-       d="m 160,102.5 c 0,3.59 2.91,6.5 6.5,6.5 3.59,0 6.5,-2.91 6.5,-6.5 0,-3.59 -2.91,-6.5 -6.5,-6.5 -3.59,0 -6.5,2.91 -6.5,6.5" /><path
-       style="fill-opacity:0.36000001"
-       inkscape:connector-curvature="0"
-       id="path3681"
-       d="m 170,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /><path
-       style="fill:#ffffff"
-       inkscape:connector-curvature="0"
-       id="path3683"
-       d="M 170,99.93 169.07,99 166.5,101.57 163.93,99 163,99.93 l 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /></g><g
-     id="g2423"><path
-       style="fill-opacity:0.23999999"
-       inkscape:connector-curvature="0"
-       id="path3685"
-       d="m 184.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /><path
-       style="fill:#676767"
-       inkscape:connector-curvature="0"
-       id="path3687"
-       d="M 184.5,99.93 183.57,99 181,101.57 178.43,99 l -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /></g><g
-     id="g2409"><path
-       inkscape:connector-curvature="0"
-       id="path3689"
-       d="m 131.65,116.21 -1.44,-2.03 -1.21,1.21 2.55,3.61 6.45,-7.67 -1.12,-1.33 z" /></g><g
-     id="g2491"><path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/usr/local/google/home/caseq/aa.png"
-       sodipodi:nodetypes="ccccccccccccccccccccccccc"
-       inkscape:connector-curvature="0"
-       id="path3550"
-       d="m 110.49999,127.4989 -1,0 2,-2 2,2 -1,0 c 0,0 -0.0345,4.6379 -0.0345,4.0345 l 4.03448,-0.034 0,-1 2,2 -2,2 0,-1 -4.03449,-0.034 0.0345,4.0346 1,0 -2,2 -2,-2 1,0 0.0345,-4.0346 -4.03448,0.034 0,1 -2,-2 2,-2 0,1 4.03448,0.034 z"
-       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><g
-     id="g2488"><path
-       transform="matrix(0.36,0,0,0.36,125.49998,127.46)"
-       d="m 53,14 a 3,3 0 1 1 -6,0 3,3 0 1 1 6,0 z"
-       sodipodi:ry="3"
-       sodipodi:rx="3"
-       sodipodi:cy="14"
-       sodipodi:cx="50"
-       id="path3635"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.77777767;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       sodipodi:type="arc" /><path
-       sodipodi:nodetypes="cccccccc"
-       inkscape:connector-curvature="0"
-       id="path4411-7"
-       d="m 143.48385,129.5 2.54033,-2 -1.5242,0 0,-2 -2,0 -0.0161,2 -1.54033,0 z"
-       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
-       sodipodi:nodetypes="cccccccc"
-       inkscape:connector-curvature="0"
-       id="path4411-7-7"
-       d="m 146.49998,132.5 2,2.5 0,-1.4998 2,-1e-4 0,-2.0002 -2,1e-4 0,-1.5 z"
-       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
-       sodipodi:nodetypes="cccccccc"
-       inkscape:connector-curvature="0"
-       id="path4411-7-7-3"
-       d="m 143.49998,135.5 -2.5,2 1.5,0 0,2 2,0 0,-2 1.5,0 z"
-       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
-       sodipodi:nodetypes="cccccccc"
-       inkscape:connector-curvature="0"
-       id="path4411-7-7-3-5"
-       d="m 140.49998,132.5 -2,-2.5 0,1.4999 -2,0 0,2.0002 2,-3e-4 0,1.5002 z"
-       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g><g
-     id="g2481"><path
-       sketch:type="MSShapeGroup"
-       id="Rotate"
-       d="m 169.19838,130.1487 c 0.0551,-0.1128 0.15339,-0.22 0.2313,-0.3064 0.54584,-0.6074 1.38893,-1.1974 3.00529,-1.5702 l 0,-2.1715 c -1.29309,0.2523 -2.31462,0.6686 -3.304,1.5597 -0.33248,0.3832 -0.50543,0.6247 -0.514,1.1665 -0.007,0.443 0.17732,0.8863 0.58141,1.3219 z m 6.63093,3.1292 c -1.61635,-0.024 -3.10906,-0.2558 -4.62277,-0.764 -2.69382,-0.9037 -3.02857,-2.1697 -3.17032,-2.5931 -0.0958,1.6897 0.028,2.9573 0.0346,3.0648 0.092,1.5004 1.29179,2.6742 2.15751,3.1151 1.7796,0.9067 3.66137,1.3756 5.60099,1.4151 l 0,2.4842 3.25098,-4.6483 -3.25098,-4.6486 0,2.5748 z m -0.32327,-5.2959 c 1.61636,0.01 3.45286,0.3384 5.2454,1.1131 0.73528,0.3177 1.32751,0.7904 1.80821,1.3048 0.33152,-0.1523 0.80672,-0.7308 0.74126,-1.2923 -0.16163,-1.3879 -1.62637,-2.1912 -1.88014,-2.3045 -1.7704,-0.7908 -3.9751,-1.0356 -5.91473,-1.0589 l 0,-1.7442 -2.01317,2.8787 2.01317,2.8783 0,-1.775 z m 8.42363,1.8658 c -0.0824,0.6478 -0.82676,2.0349 -3.89784,2.9138 l 0,4.5247 c 1.13145,-0.3677 2.46495,-1.2956 3.17873,-2.1988 0.2911,-0.3677 0.46906,-0.875 0.57736,-1.242 0.33216,-1.1229 0.18604,-3.3136 0.14175,-3.9977 z"
-       inkscape:connector-curvature="0"
-       style="fill:#000000;fill-opacity:1;stroke:none" /></g><g
-     id="g2472"><path
-       id="path3509-0"
-       d="m 240.76701,127 -1.53402,0 0,4.23299 -4.23299,0 0,1.53402 4.23299,0 0,4.23299 1.53402,0 0,-4.23299 4.23299,0 0,-1.53402 -4.23299,0 0,-4.23299 z"
-       inkscape:connector-curvature="0" /></g><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 228.56466,156.76923 h 48 v 48 h -48 z"
-     id="path3712" /><g
-     id="g2462"><path
-       id="path3714"
-       d="m 310.7696,127.0439 -1.81599,-1.81636 c -0.30331,-0.30338 -0.79716,-0.30338 -1.10048,0 l -2.43038,2.43089 -1.48935,-1.49354 -1.10047,1.1007 1.10437,1.1046 L 297,135.30504 V 139 h 3.69419 l 6.9373,-6.93874 1.10048,1.1046 1.10048,-1.10072 -1.49324,-1.49353 2.43039,-2.43089 c 0.3072,-0.30338 0.3072,-0.79345 0,-1.09682 z m -10.72092,10.40033 -1.49324,-1.49354 6.27235,-6.27365 1.49323,1.49354 -6.27234,6.27365 z"
-       inkscape:connector-curvature="0" /></g><g
-     id="g2228"><g
-       style="fill:none;stroke:none"
-       transform="translate(328,28)"
-       sketch:type="MSPage"
-       id="Page-1"><g
-         style="fill:#000000"
-         sketch:type="MSArtboardGroup"
-         id="Replay"><path
-           inkscape:connector-curvature="0"
-           sketch:type="MSShapeGroup"
-           id="Shape"
-           d="M 2.5858334,13.890843 C 0.99596482,12.428959 0,10.331325 0,8 0,3.58 3.58,0 8,0 c 4.42,0 8,3.58 8,8 0,4.42 -3.58,8 -8,8 l 0,-1.6 0,0 c 3.528,0 6.4,-2.872 6.4,-6.4 C 14.4,4.472 11.528,1.6 8,1.6 4.472,1.6 1.6,4.472 1.6,8 c 0,1.9357374 0.8646098,3.673987 2.2277938,4.848714 L 5.520254,11.428571 5.5353988,15.891545 1.1428571,15.101644 2.5858334,13.890843 z M 6.5066666,11.428571 11.078095,8 6.5066666,4.5714286 l 0,6.8571424 z" /></g></g></g><path
-     d="M 0,24 H 24 V 48 H 0 z"
-     id="path3216"
-     inkscape:connector-curvature="0"
-     style="fill:none" /><g
-     id="g2231"><path
-       inkscape:connector-curvature="0"
-       sketch:type="MSShapeGroup"
-       id="Icon"
-       d="m 328,60 c 0,4.42 3.58,8 8,8 4.42,0 8,-3.58 8,-8 0,-4.42 -3.58,-8 -8,-8 -4.42,0 -8,3.58 -8,8 z m 8,6.4 c -3.528,0 -6.4,-2.872 -6.4,-6.4 0,-3.528 2.872,-6.4 6.4,-6.4 3.528,0 6.4,2.872 6.4,6.4 0,3.528 -2.872,6.4 -6.4,6.4 z M 334.50667,63.428571 339.0781,60 l -4.57143,-3.428571 0,6.857142 z" /></g><g
-     id="g2223"><path
-       inkscape:connector-curvature="0"
-       sketch:type="MSShapeGroup"
-       id="path3448"
-       d="m 333.6,15.2 1.6,0 0,-6.4 -1.6,0 0,6.4 0,0 z M 336,4 c -4.42,0 -8,3.58 -8,8 0,4.42 3.58,8 8,8 4.42,0 8,-3.58 8,-8 0,-4.42 -3.58,-8 -8,-8 l 0,0 z m 0,14.4 c -3.528,0 -6.4,-2.872 -6.4,-6.4 0,-3.528 2.872,-6.4 6.4,-6.4 3.528,0 6.4,2.872 6.4,6.4 0,3.528 -2.872,6.4 -6.4,6.4 l 0,0 z m 0.8,-3.2 1.6,0 0,-6.4 -1.6,0 0,6.4 0,0 z" /></g><g
-     id="g2267"><path
-       sodipodi:nodetypes="ccccc"
-       inkscape:connector-curvature="0"
-       id="path3963"
-       d="m 107,33 8,0 0,6 -8,0 z"
-       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.19999981;stroke-opacity:1;stroke-dasharray:none" /><path
-       d="m 115,36 4,-4 0,8"
-       id="path3871"
-       inkscape:connector-curvature="0" /></g><path
-     d="M 0,24 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z"
-     id="path3510"
-     inkscape:connector-curvature="0"
-     style="fill:none" /><path
-     d="M 0,24 H 24 V 48 H 0 z"
-     id="path3223"
-     inkscape:connector-curvature="0"
-     style="fill:none" /><g
-     id="g2200"><path
-       inkscape:connector-curvature="0"
-       id="path3225"
-       d="m 111.99999,6.690909 c -3.63635,0 -6.74181,2.261818 -7.99999,5.454546 1.25818,3.192727 4.36364,5.454545 7.99999,5.454545 3.63636,0 6.74182,-2.261818 8,-5.454545 -1.25818,-3.192728 -4.36364,-5.454546 -8,-5.454546 z m 0,9.090909 c -2.00726,0 -3.63635,-1.629091 -3.63635,-3.636363 0,-2.007273 1.62909,-3.636364 3.63635,-3.636364 2.00727,0 3.63636,1.629091 3.63636,3.636364 0,2.007272 -1.62909,3.636363 -3.63636,3.636363 z m 0,-5.818182 c -1.20726,0 -2.18181,0.974546 -2.18181,2.181819 0,1.207272 0.97455,2.181818 2.18181,2.181818 1.20727,0 2.18182,-0.974546 2.18182,-2.181818 0,-1.207273 -0.97455,-2.181819 -2.18182,-2.181819 z" /></g><path
-     d="M 0,24 H 24 V 48 H 0 z"
-     id="path3224"
-     inkscape:connector-curvature="0"
-     style="fill:none" /><path
-     d="M 0,24 H 24 V 48 H 0 z"
-     id="path3229"
-     inkscape:connector-curvature="0"
-     style="fill:none" /><g
-     id="g2256"><path
-       transform="matrix(1.4142135,0,0,1.4142135,-86.874996,-12.771743)"
-       d="m 209.92234,31.304852 a 1.0606602,1.0606602 0 1 1 -2.12132,0 1.0606602,1.0606602 0 1 1 2.12132,0 z"
-       sodipodi:ry="1.0606602"
-       sodipodi:rx="1.0606602"
-       sodipodi:cy="31.304852"
-       sodipodi:cx="208.86168"
-       id="path3518"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       sodipodi:type="arc" /><path
-       sodipodi:type="arc"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="path4288"
-       sodipodi:cx="208.86168"
-       sodipodi:cy="31.304852"
-       sodipodi:rx="1.0606602"
-       sodipodi:ry="1.0606602"
-       d="m 209.92234,31.304852 a 1.0606602,1.0606602 0 1 1 -2.12132,0 1.0606602,1.0606602 0 1 1 2.12132,0 z"
-       transform="matrix(1.4142135,0,0,1.4142135,-86.874986,-7.771742)" /><path
-       transform="matrix(1.4142135,0,0,1.4142135,-86.874986,-2.771743)"
-       d="m 209.92234,31.304852 a 1.0606602,1.0606602 0 1 1 -2.12132,0 1.0606602,1.0606602 0 1 1 2.12132,0 z"
-       sodipodi:ry="1.0606602"
-       sodipodi:rx="1.0606602"
-       sodipodi:cy="31.304852"
-       sodipodi:cx="208.86168"
-       id="path4290"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       sodipodi:type="arc" /></g><g
-     id="g2378"><path
-       id="path3288"
-       d="m 23,157 -2,0 0,2 2,0 z" /><path
-       id="path3286"
-       d="m 23,161 -2,0 0,2 c 1,0 2,-1 2,-2 z" /><path
-       id="path3284"
-       d="m 23,153 -2,0 0,2 2,0 z" /><path
-       id="path3282"
-       d="m 21,149 0,2 2,0 c 0,-1 -1,-2 -2,-2 z" /><path
-       sodipodi:nodetypes="scccss"
-       inkscape:connector-curvature="0"
-       id="path3280"
-       d="m 11,163 4,0 0,-6 -6,0 0,4 c 0,1.1 0.9,2 2,2 z" /><path
-       id="path3278"
-       d="m 11,153 -2,0 0,2 2,0 z" /><path
-       id="path3276"
-       d="m 19,149 -2,0 0,2 2,0 z" /><path
-       id="path3274"
-       d="m 19,161 -2,0 0,2 2,0 z" /><path
-       id="path3272"
-       d="m 11,149 c -1,0 -2,1 -2,2 l 2,0 z" /><path
-       id="path3231"
-       d="m 15,149 -2,0 0,2 2,0 z" /></g><path
-     d="M0 0h24v24H0z"
-     fill="none"
-     id="path3242" /><g
-     id="g2387"><path
-       inkscape:connector-curvature="0"
-       id="path3240"
-       d="M 76.94,152 76,152.94 79.05334,156 76,159.06 l 0.94,0.94 4,-4 z" /><path
-       inkscape:connector-curvature="0"
-       id="path3240-4"
-       d="M 80.94,152 80,152.94 83.05334,156 80,159.06 l 0.94,0.94 4,-4 z" /></g><g
-     id="g2508"><g
-       transform="matrix(0.94736838,0,0,0.94736838,5.4210487,7.7368413)"
-       id="g3254"><g
-         id="g3344"
-         transform="matrix(1.0555556,0,0,1.0555556,-5.7222183,-9.2222216)"><path
-           id="path3308"
-           d="m 103,148 h 18 v 18 h -18 z"
-           inkscape:connector-curvature="0"
-           style="fill:none" /><path
-           id="path3310"
-           d="m 115.42,154.705 -6.705,-6.705 -1.0575,1.0575 1.785,1.785 -3.8625,3.8625 c -0.4425,0.4425 -0.4425,1.155 0,1.59 l 4.125,4.125 c 0.2175,0.2175 0.51,0.33 0.795,0.33 0.285,0 0.5775,-0.1125 0.795,-0.33 l 4.125,-4.125 c 0.4425,-0.435 0.4425,-1.1475 0,-1.59 z m -8.5125,0.795 3.5925,-3.5925 3.5925,3.5925 h -7.185 z m 10.3425,1.125 c 0,0 -1.5,1.6275 -1.5,2.625 0,0.825 0.675,1.5 1.5,1.5 0.825,0 1.5,-0.675 1.5,-1.5 0,-0.9975 -1.5,-2.625 -1.5,-2.625 z"
-           inkscape:connector-curvature="0" /><path
-           id="path3312"
-           d="m 103,163 h 18 v 3 h -18 z"
-           inkscape:connector-curvature="0"
-           style="fill-opacity:0.36000001" /></g></g></g><g
-     id="g2514"><g
-       transform="matrix(0.75,0,0,0.75,53.578717,0.56667794)"
-       id="g3518"><path
-         style="fill:none"
-         inkscape:connector-curvature="0"
-         d="m 108.56171,195.24443 h 24 v 24 h -24 z"
-         id="path3482" /><path
-         style="fill-opacity:0.36000001"
-         inkscape:connector-curvature="0"
-         d="m 108.56171,215.24443 h 24 v 4 h -24 z"
-         id="path3484" /><path
-         inkscape:connector-curvature="0"
-         d="m 119.56171,198.24443 -5.5,14 h 2.25 l 1.12,-3 h 6.25 l 1.12,3 h 2.25 l -5.49,-14 h -2 z m -1.38,9 2.38,-6.33 2.38,6.33 h -4.76 z"
-         id="path3486" /></g></g><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 166,147 h 18 v 18 h -18 z"
-     id="path3947" /><g
-     id="g2517"><path
-       id="path3949"
-       d="M 181.51625,154.52625 C 181.00625,151.94625 178.73,150 176,150 c -2.1675,0 -4.04625,1.23 -4.9875,3.02625 C 168.75875,153.27 167,155.17875 167,157.5 c 0,2.48625 2.01375,4.5 4.5,4.5 h 9.75 c 2.07,0 3.75,-1.68 3.75,-3.75 0,-1.98 -1.54125,-3.585 -3.48375,-3.72375 z M 181.25,160.5 h -9.75 c -1.6575,0 -3,-1.3425 -3,-3 0,-1.6575 1.3425,-3 3,-3 h 0.5325 c 0.49125,-1.72875 2.0775,-3 3.9675,-3 2.28,0 4.125,1.845 4.125,4.125 V 156 h 1.125 c 1.24125,0 2.25,1.00875 2.25,2.25 0,1.24125 -1.00875,2.25 -2.25,2.25 z"
-       inkscape:connector-curvature="0" /></g><g
-     id="g2531"><path
-       id="path3923"
-       d="m 278,150 h -10.5 c -0.8325,0 -1.5,0.675 -1.5,1.5 v 9 c 0,0.825 0.6675,1.5 1.5,1.5 H 278 c 0.825,0 1.5,-0.675 1.5,-1.5 v -9 c 0,-0.825 -0.6675,-1.5 -1.5,-1.5 z m 0,10.5 H 267.5 V 153 H 278 v 7.5 z"
-       inkscape:connector-curvature="0"
-       style="fill:#010101" /></g><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 262.97094,147.06757 h 18 v 18 h -18 z"
-     id="path3925" /><g
-     id="g2541"><g
-       id="g4074"
-       style="stroke:#000000"
-       transform="matrix(0.72907174,0,0,0.72907174,327.22683,147.61664)"><path
-         id="path4076"
-         transform="translate(0.535,1.346)"
-         d="M 7.854,6.963 6.877,7.279 6.857,8.617 6.889,8.705 7.398,9.699 6.188,10.578 5.398,9.787 5.326,9.73 4.047,9.336 l -0.604,0.83 0.77,1.094 0.078,0.053 0.996,0.504 -0.463,1.424 -1.104,-0.176 -0.092,-0.004 -1.266,0.432 0,1.027 1.266,0.434 0.092,-0.004 1.104,-0.178 0.463,1.424 -0.996,0.506 -0.078,0.051 -0.77,1.094 0.604,0.83 1.279,-0.393 0.072,-0.059 0.789,-0.791 1.211,0.879 -0.51,0.996 -0.031,0.086 0.02,1.338 0.977,0.316 0.803,-1.068 0.025,-0.09 0.172,-1.104 1.498,0 0.172,1.104 0.025,0.09 0.803,1.068 0.977,-0.316 0.02,-1.338 -0.031,-0.086 -0.51,-0.996 1.211,-0.879 0.789,0.791 0.072,0.059 1.279,0.393 0.604,-0.83 -0.771,-1.094 -0.076,-0.051 -0.996,-0.506 0.461,-1.424 1.105,0.178 0.092,0.004 1.266,-0.434 0,-1.027 -1.266,-0.432 -0.092,0.004 -1.105,0.176 -0.461,-1.424 0.996,-0.504 0.076,-0.053 0.771,-1.094 L 15.159,9.336 13.88,9.731 13.808,9.788 13.019,10.579 11.808,9.7 12.318,8.706 12.349,8.618 12.329,7.28 11.352,6.964 10.549,8.034 10.524,8.122 10.352,9.227 8.854,9.227 8.682,8.121 8.656,8.03 7.854,6.963 m 1.748,3.398 a 3.621,3.645 0 0 1 3.621,3.645 3.621,3.645 0 0 1 -3.621,3.646 3.621,3.645 0 0 1 -3.619,-3.646 3.621,3.645 0 0 1 3.619,-3.645 z"
-         inkscape:connector-curvature="0" /><path
-         id="path4078"
-         d="M 14.885,1.563 14.178,1.957 14.365,3.24 14.396,3.279 15.14,4.04 14.553,5.03 13.529,4.736 13.479,4.729 12.262,5.172 12.25,5.98 13.455,6.459 13.506,6.453 14.537,6.189 15.1,7.191 14.332,7.932 14.301,7.971 14.08,9.248 14.771,9.662 15.787,8.859 15.807,8.811 16.1,7.787 17.242,7.803 17.502,8.834 17.52,8.883 18.514,9.715 19.219,9.32 19.03,8.04 19,7.998 18.258,7.234 18.844,6.25 19.869,6.541 19.92,6.551 21.14,6.105 21.15,5.297 19.943,4.818 19.893,4.824 18.861,5.088 18.301,4.086 19.07,3.346 19.1,3.307 19.322,2.029 18.627,1.615 17.609,2.418 17.59,2.467 17.303,3.49 16.16,3.475 15.896,2.443 15.879,2.395 14.885,1.563 z m 1.814,2.138 a 1.938,1.938 0 0 1 1.938,1.938 1.938,1.938 0 0 1 -1.938,1.937 1.938,1.938 0 0 1 -1.937,-1.937 1.938,1.938 0 0 1 1.937,-1.938 z"
-         inkscape:connector-curvature="0"
-         style="stroke-width:0.89899999" /></g></g><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 71,124 h 18 v 18 H 71 z"
-     id="path4246" /><g
-     id="g2495"><g
-       id="g2390"><path
-         inkscape:connector-curvature="0"
-         d="m 82,129 -2,-2 h -5 c -0.55,0 -1,0.45 -1,1 v 10 c 0,0.55 0.45,1 1,1 h 12 c 0.55,0 1,-0.45 1,-1 v -8 c 0,-0.55 -0.45,-1 -1,-1 h -5 z"
-         id="path4248" /></g></g><g
-     id="g2327"><path
-       id="path4365"
-       d="m 235,76 c -0.55,0 -0.99,0.45 -0.99,1 L 234,91 c 0,0.55 0.44,1 1,1 h 10 c 0.55,0 1,-0.45 1,-1 V 81 l -5,-5 h -6 z m 6,5 v -4 l 4,4 h -4 z"
-       inkscape:connector-curvature="0" /><path
-       id="path4367"
-       d="m 231,75 h 18 v 18 h -18 z"
-       inkscape:connector-curvature="0"
-       style="fill:none" /></g><g
-     id="g2453"><g
-       transform="translate(31,0)"
-       id="g3680"><path
-         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
-         d="m 300,100.99977 0,4.00012 0,1.00007 3.34345,0.53115 -0.0156,8.04683 L 302,114.99977 c 0.006,0.59278 0.43931,1.01145 1,1 l 8,0 c 0.57896,0.002 0.98177,-0.42708 1,-1 l 0,-14 c -0.0102,-0.53477 -0.48177,-0.99739 -1,-1 l -10,0 c -0.53297,0.008 -0.99716,0.45677 -1,1 z m 1,0 10,0 0,13.9995 -8,0 0.71845,-0.42179 0.0937,-8.4218 -2.8122,-0.1561 0,-0.99993 z"
-         id="rect3641-2-5-28"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccccccccccccccccccccc" /><path
-         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
-         d="m 297,105.99954 0,9 c 0.006,0.59278 0.43931,1.01145 1,1 l 5,0 c 0.57896,0.002 0.98177,-0.42708 1,-1 l 0,-9 c -0.0102,-0.53477 -0.48177,-0.99739 -1,-1 l -5,0 c -0.53297,0.008 -0.99716,0.45677 -1,1 z m 1,1.00023 5,0 0,7 -5,0 z"
-         id="rect3641-2-5-28-7"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccccccccccccc" /></g></g><g
-     id="g2206"><path
-       id="path4"
-       d="M 169,16.08946 V 19 h 2.91054 L 180.1944,10.71614 177.28385,7.8055997 169,16.08946 z m 13.76911,-7.9387003 c 0.30785,-0.30785 0.30785,-0.79294 0,-1.1007901 l -1.81908,-1.81909 c -0.30785,-0.3078399 -0.79295,-0.3078399 -1.10078,0 l -1.52058,1.52991 2.91054,2.9105401 1.5299,-1.52057 z"
-       inkscape:connector-curvature="0" /></g><g
-     id="g2459"><g
-       sketch:type="MSPage"
-       id="Page-1-3"
-       style="fill:none;stroke:none"
-       transform="translate(330,126)"><g
-         transform="translate(-2,-2)"
-         sketch:type="MSLayerGroup"
-         id="inspect-element"><path
-           sketch:type="MSShapeGroup"
-           id="bounds-9"
-           d="M 0,0 16,0 16,16 0,16 0,0 z"
-           inkscape:connector-curvature="0"
-           style="opacity:0.5" /><path
-           id="path3750"
-           sketch:type="MSShapeGroup"
-           d="M 6,14 3.5,14 C 2.5,14 2,13.5 2,12.5 l 0,-9 C 2,2.5 2.5,2 3.5,2 l 9,0 C 14,2 14,3.4678488 14,3.5 14,2 14,6 14,6 l -1,0 0,-3 -10,0 0,10 3,0 0,1 z m 8.999992,-5 -2.999984,1.99997 3,3 -1,1 -3,-3 L 8.9999924,15 l -2,-7.9999695 L 14.999992,9 l 0,0 z"
-           inkscape:connector-curvature="0"
-           style="fill:#000000" /></g></g></g><g
-     id="g2522"><g
-       transform="translate(201,149)"
-       sketch:type="MSPage"
-       id="Page-1-97"
-       style="fill:none;stroke:none"><g
-         transform="translate(-1,-1)"
-         sketch:type="MSLayerGroup"
-         id="Rotate-8"
-         style="fill:#000000"><path
-           sketch:type="MSShapeGroup"
-           id="rotate"
-           d="m 10.624268,2.47 c 1.915481,0.9041667 3.286192,2.7533333 3.497071,4.9466667 l 0.878661,0 C 14.701255,3.8233333 11.684519,1 8,1 L 7.6133891,1.0175 9.8451883,3.24 10.624268,2.47 l 0,0 z M 6.9631799,2.0208333 c -0.3456067,-0.3441666 -0.902092,-0.3441666 -1.241841,0 l -3.725523,3.71 C 1.6502092,6.075 1.6502092,6.6291667 1.9958159,6.9675 l 7.0410042,7.011667 c 0.3456067,0.344166 0.902092,0.344166 1.2418409,0 l 3.725523,-3.71 c 0.345607,-0.344167 0.345607,-0.8983337 0,-1.236667 l -7.0410041,-7.0116667 0,0 z M 9.6577406,13.360833 2.6167364,6.3491667 l 3.725523,-3.71 7.0410046,7.0116666 -3.7255234,3.7099997 0,0 z M 5.3757322,13.53 C 3.4602511,12.631667 2.0895398,10.776667 1.8786611,8.5833333 L 1,8.5833333 C 1.2987448,12.176667 4.3154812,15 8,15 L 8.3866109,14.9825 6.1548117,12.76 l -0.7790795,0.77 0,0 z"
-           inkscape:connector-curvature="0" /></g></g></g><g
-     id="g2501"><g
-       id="g2366"><g
-         style="fill:none;stroke:none"
-         id="Page-1-0"
-         sketch:type="MSPage"
-         transform="matrix(1.1,0,0,1.1,10,127)"><g
-           style="fill:#000000"
-           id="Forward-Right"
-           sketch:type="MSLayerGroup"
-           transform="translate(-3,-3)"><path
-             inkscape:connector-curvature="0"
-             d="m 8,13 c 2.761424,0 5,-2.238576 5,-5 C 13,5.2385763 10.761424,3 8,3 5.2385763,3 3,5.2385763 3,8 c 0,2.761424 2.2385763,5 5,5 z M 8,11 8,9 5,9 5,7 8,7 8,5 11,8 8,11 z"
-             id="forward-right"
-             sketch:type="MSShapeGroup" /></g></g></g></g><polygon
-     style="opacity:0.5;fill:none;stroke:none"
-     id="bounds-5"
-     points="16,0 16,16 0,16 0,0 "
-     transform="translate(232.08128,27.81372)" /><g
-     id="g3185"><path
-       id="path3730"
-       d="m 242.27334,38.919997 c -0.75073,0.561322 -1.68258,0.893723 -2.69206,0.893723 -2.48528,0 -4.5,-2.014719 -4.5,-4.5 0,-2.485281 2.01472,-4.5 4.5,-4.5 2.48528,0 4.5,2.014719 4.5,4.5 0,1.115373 -0.40579,2.135968 -1.0778,2.922205 l 2.34557,2.345562 -0.70711,0.707107 z m -2.69206,-0.106277 c 1.933,0 3.5,-1.567003 3.5,-3.5 0,-1.932997 -1.567,-3.5 -3.5,-3.5 -1.933,0 -3.5,1.567003 -3.5,3.5 0,1.932997 1.567,3.5 3.5,3.5 z"
-       inkscape:connector-curvature="0"
-       style="fill:#5b5b5b;stroke:none" /></g><g
-     id="g2317"><g
-       transform="translate(199,51)"
-       style="fill:none;stroke:none"
-       id="Swatch-3"><g
-         id="add_text_shadow"><rect
-           style="fill:#212121;fill-opacity:0"
-           id="Rectangle-8-6"
-           x="0"
-           y="0"
-           width="18"
-           height="18" /><path
-           style="fill:#000000;fill-opacity:0.36000001"
-           inkscape:connector-curvature="0"
-           d="M 15.25,8 16,8 16,6.125 16,5 5,5 5,6.125 5,8 5.75,8 c 0,-0.8284271 0.6715729,-1.5 1.5,-1.5 l 2.5,0 0,7.25 c 0,0.828427 -0.6715729,1.5 -1.5,1.5 l 0,0.75 1.875,0 0.75,0 1.875,0 0,-0.75 c -0.828427,0 -1.5,-0.671573 -1.5,-1.5 l 0,-7.25 2.5,0 c 0.828427,0 1.5,0.6715729 1.5,1.5 z"
-           id="Combined-Shape-Copy" /><path
-           style="fill:#000000"
-           inkscape:connector-curvature="0"
-           d="M 12.25,5 13,5 13,3.125 13,2 2,2 2,3.125 2,5 2.75,5 c 0,-0.8284271 0.6715729,-1.5 1.5,-1.5 l 2.5,0 0,7.25 c 0,0.828427 -0.6715729,1.5 -1.5,1.5 l 0,0.75 1.875,0 0.75,0 1.875,0 0,-0.75 c -0.8284271,0 -1.5,-0.671573 -1.5,-1.5 l 0,-7.25 2.5,0 c 0.828427,0 1.5,0.6715729 1.5,1.5 z"
-           id="Combined-Shape-7" /></g></g></g><g
-     id="g2310"><g
-       transform="translate(167,51)"
-       id="g3002"><rect
-         style="fill:#212121;fill-opacity:0"
-         height="18"
-         width="18"
-         y="0"
-         x="0"
-         id="Rectangle-8-60" /><path
-         style="fill:#000000;fill-opacity:0.36000001"
-         inkscape:connector-curvature="0"
-         id="Combined-Shape-6"
-         d="m 13,5 1.493562,0 C 15.325544,5 16,5.6715406 16,6.5064385 l 0,7.9871235 C 16,15.325544 15.328459,16 14.493562,16 L 6.5064385,16 C 5.6744555,16 5,15.328459 5,14.493562 L 5,13 11.493562,13 C 12.328459,13 13,12.325544 13,11.493562 L 13,5 z" /><path
-         style="fill:#212121"
-         d="M 3.5,2 C 2.669,2 2,2.669 2,3.5 l 0,8 C 2,12.331 2.669,13 3.5,13 l 8,0 c 0.831,0 1.5,-0.669 1.5,-1.5 l 0,-8 C 13,2.669 12.331,2 11.5,2 l -8,0 z m 0,1.5 8,0 0,8 -8,0 0,-8 z"
-         id="Rectangle-7-Copy-3"
-         inkscape:connector-curvature="0" /></g></g><g
-     id="g2436"><g
-       transform="translate(232,99.9)"
-       style="fill:none;stroke:none"
-       id="Page-1-36"><g
-         id="snippet_icon"><g
-           id="snippet_base"><rect
-             style="opacity:0;fill:#ffffff"
-             id="Rectangle-2"
-             x="0"
-             y="0"
-             width="16"
-             height="16" /><path
-             style="fill:#000000"
-             inkscape:connector-curvature="0"
-             d="M 9,1 3.9953976,1 C 3.4556644,1 3,1.4507801 3,2.0068455 L 3,13.993154 C 3,14.550051 3.4456547,15 3.9953976,15 l 8.0092044,0 C 12.544336,15 13,14.54922 13,13.993154 L 13,5 9,1 9,1 z m 3,4 -3,0 0,-3 3,3 0,0 z M 6,7 11,9.5 6,12 6,7 6,7 z"
-             id="Combined-Shape-Copy-7" /></g></g></g></g><g
-     id="g2536"><g
-       transform="matrix(0.87152778,0,0,0.87152778,295.07107,147.56791)"
-       id="g3545"
-       style="fill:#000000;fill-rule:evenodd"><path
-         id="path3547"
-         d="M 0,0 H 18 V 18 H 0 z"
-         inkscape:connector-curvature="0"
-         style="fill:none" /><path
-         id="path3549"
-         d="M 12,3.5 A 1.505,1.505 0 0 0 10.494,2 H 4.506 C 3.676,2 3,2.674 3,3.506 v 7.988 C 3,12.326 3.671,12.997 4.5,13 V 3.5 H 12 z M 6,6.506 C 6,5.674 6.676,5 7.506,5 h 5.988 C 14.326,5 15,5.672 15,6.506 v 7.988 C 15,15.326 14.324,16 13.494,16 H 7.506 A 1.505,1.505 0 0 1 6,14.494 V 6.506 z M 7.5,6.5 h 6 v 8 h -6 v -8 z"
-         inkscape:connector-curvature="0" /></g></g><g
-     style="fill:#000000;fill-rule:evenodd"
-     id="g3290"
-     transform="matrix(0.90179072,0,0,0.90179072,264.3085,75.525127)"><path
-       style="fill:none"
-       inkscape:connector-curvature="0"
-       d="M 0,0 H 18 V 18 H 0 z"
-       id="path3292" /><path
-       inkscape:connector-curvature="0"
-       d="M 4.174,8.343 2.76,9.757 7.003,13.999 15.488,5.514 14.074,4.1 7.003,11.171 z"
-       id="path3294" /></g><g
-     id="g2191"><path
-       id="path3555-5"
-       d="M 16 6 C 12.69 6 10 8.69 10 12 C 10 15.31 12.69 18 16 18 C 19.31 18 22 15.31 22 12 L 20 12 C 20 14.209139 18.209139 16 16 16 C 13.790861 16 12 14.209139 12 12 C 12 9.7908611 13.790861 8 16 8 C 17.275627 8 18.392569 8.6012713 19.125 9.53125 L 21.46875 9.53125 C 20.526539 7.4496106 18.430781 6 16 6 z " /><path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path3660"
-       d="m 21.090773,6.879988 0,3.0918004 -3.0918,0 z"
-       style="fill:#000000;stroke:#000000;stroke-width:1.06808328999999991px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /></g><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 169,29 h 18 v 18 h -18 z"
-     id="path4367-6" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 167.25,27.250001 h 20 v 20 h -20 z"
-     id="path5182" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 165.125,25.125 h 20 v 20 h -20 z"
-     id="path6104" /><rect
-     style="fill:#ffffff;fill-opacity:0;stroke:none"
-     id="bg-5"
-     x="293.9649"
-     y="74.012558"
-     width="20"
-     height="20" /><g
-     id="g2259"><path
-       inkscape:connector-curvature="0"
-       id="path4365-2"
-       d="m 171,28 c -0.55,0 -1,0.45 -1,1 l 0,14 c 0,0.55 0.44,1 1,1 l 5.09375,0 c -0.0656,-0.32311 -0.0937,-0.657534 -0.0937,-1 0,-2.761424 2.23858,-5 5,-5 0.34247,0 0.67689,0.02816 1,0.09375 l 0,-5.09375 -5,-5 -6,0 z m 6,1 4,4 -4,0 0,-4 z"
-       style="fill:#000000;fill-opacity:1" /></g><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 201,4.999999 h 18 v 18 h -18 z"
-     id="path4367-6-7" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 199.25,3.25 h 20 v 20 h -20 z"
-     id="path5182-0" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 297,77 h 18 v 18 h -18 z"
-     id="path4367-6-6" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 295.25,75.250001 h 20 v 20 h -20 z"
-     id="path5182-06" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 293.125,73.125 h 20 v 20 h -20 z"
-     id="path6104-2" /><circle
-     d="m 18,17 c 0,1.656854 -1.343146,3 -3,3 -1.656854,0 -3,-1.343146 -3,-3 0,-1.656854 1.343146,-3 3,-3 1.656854,0 3,1.343146 3,3 z"
-     style="fill:#009802;fill-opacity:1"
-     sodipodi:ry="3"
-     sodipodi:rx="3"
-     sodipodi:cy="17"
-     sodipodi:cx="15"
-     cx="15"
-     cy="17"
-     r="3"
-     id="circle6106-6"
-     transform="translate(326,74)" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 329,77 h 18 v 18 h -18 z"
-     id="path4367-6-8" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 327.25,75.250001 h 20 v 20 h -20 z"
-     id="path5182-7" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 325.125,73.125 h 20 v 20 h -20 z"
-     id="path6104-9" /><rect
-     style="fill:#ffffff;fill-opacity:0;stroke:none"
-     id="bg"
-     x="63.951164"
-     y="34.903393"
-     width="14"
-     height="14" /><rect
-     style="fill:#ffffff;fill-opacity:0;stroke:none"
-     id="bg-7"
-     x="63.625"
-     y="23.5"
-     width="14"
-     height="14" /><g
-     id="g2275"><g
-       transform="translate(-1.625,-0.5)"
-       id="g6839"><path
-         style="fill:#000000;stroke:none"
-         inkscape:connector-curvature="0"
-         d="m 71.625,25.5 -4.00297,0 c -0.543994,0 -0.99703,0.445655 -0.99703,0.995398 l 0,8.009204 c 0,0.539734 0.446386,0.995398 0.99703,0.995398 l 6.00594,0 c 0.543994,0 0.99703,-0.445655 0.99703,-0.995398 l 0,-6.004602 -3,-3 0,0 z m 0,1 2,2 -2,0 0,-2 z m -4,0 3,0 0,3 3,0 0,5 -6,0 0,-8 z"
-         id="shape-5" /></g></g><rect
-     style="fill:#ffffff;fill-opacity:0;stroke:none"
-     id="bg-2"
-     x="191.87378"
-     y="-0.0435686"
-     width="14"
-     height="14" /><g
-     id="g2271"><circle
-       transform="matrix(1.2,0,0,1.2,72.4,21.2)"
-       r="2.5"
-       cy="11.5"
-       cx="10.5"
-       id="shape-8"
-       sodipodi:cx="10.5"
-       sodipodi:cy="11.5"
-       sodipodi:rx="2.5"
-       sodipodi:ry="2.5"
-       style="fill:#009802;fill-opacity:1;stroke:none"
-       d="M 13,11.5 C 13,12.880712 11.880712,14 10.5,14 9.1192881,14 8,12.880712 8,11.5 8,10.119288 9.1192881,9 10.5,9 11.880712,9 13,10.119288 13,11.5 z" /><path
-       sodipodi:nodetypes="sssscscccccccscccscccc"
-       inkscape:connector-curvature="0"
-       id="shape-5-3"
-       d="m 78,25 c -0.543994,0 -1,0.450257 -1,1 l 0,8 c 0,0.539734 0.449356,1 1,1 l 3.03125,0 C 81.0079,34.836699 81,34.669761 81,34.5 81,34.330239 81.0079,34.163301 81.03125,34 L 78,34 l 0,-8 3,0 0,3 3,0 0,1.5 c 0.163301,-0.02335 0.330239,0 0.5,0 0.169761,0 0.336699,-0.02335 0.5,0 L 85,28 82,25 z m 4,1 2,2 -2,0 z"
-       style="fill:#000000;stroke:none" /></g><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 292.76613,72.135146 h 24 v 24 h -24 z"
-     id="path3652" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 288,72 h 24 v 24 h -24 z"
-     id="path3763" /><path
-     style="fill:none"
-     inkscape:connector-curvature="0"
-     d="m 236.19418,70.013825 h 24 v 24 h -24 z"
-     id="path3343" /><g
-     id="g2237"><path
-       id="path3345"
-       d="m 309.34846,84.686 c 0.0288,-0.224 0.0504,-0.448 0.0504,-0.686 0,-0.238 -0.0216,-0.462 -0.0504,-0.686 l 1.51844,-1.155 c 0.13673,-0.105 0.17272,-0.294 0.0863,-0.448 l -1.43928,-2.422 c -0.0863,-0.154 -0.28065,-0.21 -0.43897,-0.154 l -1.7919,0.7 c -0.37422,-0.28 -0.77722,-0.511 -1.2162,-0.686 l -0.27341,-1.855 C 305.77186,77.126 305.62075,77 305.44084,77 h -2.87854 c -0.17992,0 -0.33104,0.126 -0.35263,0.294 l -0.27346,1.855 c -0.43898,0.175 -0.84198,0.413 -1.21619,0.686 l -1.7919,-0.7 c -0.16551,-0.063 -0.35262,0 -0.43898,0.154 l -1.43926,2.422 c -0.0935,0.154 -0.0504,0.343 0.0863,0.448 l 1.51843,1.155 c -0.0287,0.224 -0.0504,0.455 -0.0504,0.686 0,0.231 0.0216,0.462 0.0504,0.686 l -1.51843,1.155 c -0.13673,0.105 -0.17271,0.294 -0.0863,0.448 l 1.43926,2.422 c 0.0863,0.154 0.28067,0.21 0.43898,0.154 l 1.7919,-0.7 c 0.37421,0.28 0.77721,0.511 1.21619,0.686 l 0.27346,1.855 c 0.0216,0.168 0.17271,0.294 0.35263,0.294 h 2.87854 c 0.17991,0 0.33103,-0.126 0.35263,-0.294 l 0.27345,-1.855 c 0.43898,-0.175 0.84198,-0.413 1.21619,-0.686 l 1.7919,0.7 c 0.16552,0.063 0.35263,0 0.43898,-0.154 l 1.43927,-2.422 c 0.0863,-0.154 0.0504,-0.343 -0.0863,-0.448 l -1.51844,-1.155 z m -5.34689,1.764 c -1.38892,0 -2.51874,-1.099 -2.51874,-2.45 0,-1.351 1.12982,-2.45 2.51874,-2.45 1.38889,0 2.51872,1.099 2.51872,2.45 0,1.351 -1.12983,2.45 -2.51872,2.45 z"
-       inkscape:connector-curvature="0" /></g><g
-     id="g2402"><path
-       style="fill:url(#linearGradient3620)"
-       inkscape:connector-curvature="0"
-       id="path3653"
-       d="m 118,96 c -3.87,0 -7,3.13 -7,7 0,3.87 3.13,7 7,7 3.87,0 7,-3.13 7,-7 0,-3.87 -3.13,-7 -7,-7" /><path
-       style="fill:#f27d82"
-       inkscape:connector-curvature="0"
-       id="path3655"
-       d="m 111.5,103 c 0,3.59 2.91,6.5 6.5,6.5 3.59,0 6.5,-2.91 6.5,-6.5 0,-3.59 -2.91,-6.5 -6.5,-6.5 -3.59,0 -6.5,2.91 -6.5,6.5" /><path
-       style="fill-opacity:0.36000001"
-       inkscape:connector-curvature="0"
-       id="path3657"
-       d="m 121.5,100.93 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /><path
-       style="fill:#ffffff"
-       inkscape:connector-curvature="0"
-       id="path3659"
-       d="m 121.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /></g><g
-     id="g2396"><path
-       style="fill:url(#o-3)"
-       inkscape:connector-curvature="0"
-       id="path3665"
-       d="m 103,110 c 3.87,0 7,-3.13 7,-7 0,-3.87 -3.13,-7 -7,-7 -3.87,0 -7,3.13 -7,7 0,3.87 3.13,7 7,7" /><path
-       style="fill:url(#n-3)"
-       inkscape:connector-curvature="0"
-       id="path3667"
-       d="m 103,96.5 c -3.59,0 -6.5,2.91 -6.5,6.5 0,3.59 2.91,6.5 6.5,6.5 3.59,0 6.5,-2.91 6.5,-6.5 0,-3.59 -2.91,-6.5 -6.5,-6.5" /><path
-       style="fill:#993c35"
-       inkscape:connector-curvature="0"
-       id="path3669"
-       d="m 106.5,100.93 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /><path
-       style="fill:#ffffff"
-       inkscape:connector-curvature="0"
-       id="path3671"
-       d="m 106.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z" /></g><g
-     id="g2297"><path
-       inkscape:connector-curvature="0"
-       id="path3515-3"
-       d="m 108,60 10,-5 v 10" /></g><g
-     id="g2320"><path
-       inkscape:connector-curvature="0"
-       id="path3553-8"
-       d="m 238,64 h 7 v -8 h -7 z m 9,2 H 233 V 54 h 14 z" /></g><g
-     id="g2429"><g
-       id="g1248"><rect
-         height="12"
-         width="14"
-         x="-214.5"
-         y="102.5"
-         id="rect3629-0"
-         style="fill:none;stroke:#000000"
-         transform="scale(-1,1)" /><path
-         d="m 203,108.5 5,-3.25 v 6.5"
-         id="path3631-2"
-         inkscape:connector-curvature="0" /><rect
-         height="13"
-         width="1"
-         x="-211"
-         y="102"
-         id="rect3633-4"
-         transform="scale(-1,1)" /></g></g><g
-     id="g2478"><g
-       id="g1228"><rect
-         height="12"
-         width="14"
-         x="-214.5"
-         y="126.5"
-         id="rect3635-8"
-         style="fill:none;stroke:#000000"
-         transform="scale(-1,1)" /><path
-         d="m 208,132.5 -5,-3.25 v 6.5"
-         id="path3637-3"
-         inkscape:connector-curvature="0" /><rect
-         height="13"
-         width="1"
-         x="-211"
-         y="126"
-         id="rect3639-9"
-         transform="scale(-1,1)" /></g></g><g
-     id="g2528"><g
-       transform="rotate(-90,241.5,153.5)"
-       id="g1088"><rect
-         height="12"
-         width="14"
-         x="232.5"
-         y="150.5"
-         id="rect3629-05"
-         style="fill:none;stroke:#000000" /><path
-         d="m 244,156.5 -5,-3.25 v 6.5"
-         id="path3631-22"
-         inkscape:connector-curvature="0" /><rect
-         height="13"
-         width="1"
-         x="236"
-         y="150"
-         id="rect3633-7" /></g></g><g
-     id="g2469"><g
-       id="g1212"><g
-         id="g1206"
-         transform="matrix(0,1,1,0,144,-140)"><rect
-           transform="scale(-1,1)"
-           style="fill:none;stroke:#000000"
-           id="rect3635-8-6"
-           y="126.5"
-           x="-278.5"
-           width="14"
-           height="12" /><path
-           inkscape:connector-curvature="0"
-           id="path3637-3-5"
-           d="m 272,132.5 -5,-3.25 v 6.5" /><rect
-           transform="scale(-1,1)"
-           id="rect3639-9-7"
-           y="126"
-           x="-275"
-           width="1"
-           height="13" /></g></g></g><g
-     id="g2442"><g
-       transform="rotate(-90,273.5,105.5)"
-       id="g1243"><rect
-         height="12"
-         width="14"
-         x="-278.5"
-         y="102.5"
-         id="rect3635-8-62"
-         style="fill:none;stroke:#000000"
-         transform="scale(-1,1)" /><path
-         d="m 272,108.5 -5,-3.25 v 6.5"
-         id="path3637-3-7"
-         inkscape:connector-curvature="0" /><rect
-         height="13"
-         width="1"
-         x="-275"
-         y="102"
-         id="rect3639-9-0"
-         transform="scale(-1,1)" /></g></g><g
-     id="g2448"><g
-       id="g1248-3"
-       transform="rotate(-90,257.5,57.5)"><rect
-         height="12"
-         width="14"
-         x="-214.5"
-         y="102.5"
-         id="rect3629-0-9"
-         style="fill:none;stroke:#000000"
-         transform="scale(-1,1)" /><path
-         d="m 203,108.5 5,-3.25 v 6.5"
-         id="path3631-2-9"
-         inkscape:connector-curvature="0" /><rect
-         height="13"
-         width="1"
-         x="-211"
-         y="102"
-         id="rect3633-4-9"
-         transform="scale(-1,1)" /></g></g></svg>
\ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs.png b/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs.png
deleted file mode 100644
index 1b1fe38..0000000
--- a/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs_2x.png b/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs_2x.png
deleted file mode 100644
index d9b9fa2..0000000
--- a/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs_2x.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/externs.js b/third_party/WebKit/Source/devtools/front_end/externs.js
index f6dc995f9..b94f825d 100644
--- a/third_party/WebKit/Source/devtools/front_end/externs.js
+++ b/third_party/WebKit/Source/devtools/front_end/externs.js
@@ -640,6 +640,13 @@
   /**
    * @param {string} text
    * @param {Object.<string, boolean>} options
+   * @return {!ESTree.Node}
+   */
+  parse_dammit: function(text, options) {},
+
+  /**
+   * @param {string} text
+   * @param {Object.<string, boolean>} options
    * @return {!Acorn.Tokenizer}
    */
   tokenizer: function(text, options) {},
@@ -722,6 +729,20 @@
   this.argument;
   /** @type {(string|undefined)} */
   this.operator;
+  /** @type {(!ESTree.Node|undefined)} */
+  this.right;
+  /** @type {(!ESTree.Node|undefined)} */
+  this.left;
+  /** @type {(string|undefined)} */
+  this.kind;
+  /** @type {(!ESTree.Node|undefined)} */
+  this.property;
+  /** @type {(!ESTree.Node|undefined)} */
+  this.object;
+  /** @type {(string|undefined)} */
+  this.raw;
+  /** @type {(boolean|undefined)} */
+  this.computed;
 };
 
 /**
diff --git a/third_party/WebKit/Source/devtools/front_end/formatter_worker/JavaScriptOutline.js b/third_party/WebKit/Source/devtools/front_end/formatter_worker/JavaScriptOutline.js
index f3a6c1b..f5774cf8 100644
--- a/third_party/WebKit/Source/devtools/front_end/formatter_worker/JavaScriptOutline.js
+++ b/third_party/WebKit/Source/devtools/front_end/formatter_worker/JavaScriptOutline.js
@@ -5,78 +5,155 @@
  * @param {string} content
  */
 FormatterWorker.javaScriptOutline = function(content) {
-  var chunkSize = 100000;  // characters per data chunk
+  var chunkSize = 100000;
   var outlineChunk = [];
-  var previousIdentifier = null;
-  var previousToken = null;
-  var processedChunkCharacters = 0;
-  var addedFunction = false;
-  var isReadingArguments = false;
-  var argumentsText = '';
-  var currentFunction = null;
-  var tokenizer = new FormatterWorker.AcornTokenizer(content);
-  var AT = FormatterWorker.AcornTokenizer;
+  var lastReportedOffset = 0;
 
-  while (tokenizer.peekToken()) {
-    var token = /** @type {!Acorn.TokenOrComment} */ (tokenizer.nextToken());
-    if (AT.lineComment(token) || AT.blockComment(token))
-      continue;
+  var ast;
+  try {
+    ast = acorn.parse(content, {ranges: false, ecmaVersion: 8});
+  } catch (e) {
+    ast = acorn.parse_dammit(content, {ranges: false, ecmaVersion: 8});
+  }
 
-    var tokenValue = content.substring(token.start, token.end);
+  var textCursor = new TextUtils.TextCursor(content.computeLineEndings());
+  var walker = new FormatterWorker.ESTreeWalker(beforeVisit);
+  walker.walk(ast);
+  postMessage({chunk: outlineChunk, isLastChunk: true});
 
-    if (AT.identifier(token) && previousToken &&
-        (AT.identifier(previousToken, 'get') || AT.identifier(previousToken, 'set'))) {
-      currentFunction = {
-        line: tokenizer.tokenLineStart(),
-        column: tokenizer.tokenColumnStart(),
-        name: previousToken.value + ' ' + tokenValue
-      };
-      addedFunction = true;
-      previousIdentifier = null;
-    } else if (AT.identifier(token)) {
-      previousIdentifier = tokenValue;
-      if (tokenValue && previousToken && AT.keyword(previousToken, 'function')) {
-        // A named function: "function f...".
-        currentFunction = {line: tokenizer.tokenLineStart(), column: tokenizer.tokenColumnStart(), name: tokenValue};
-        addedFunction = true;
-        previousIdentifier = null;
-      }
+  /**
+   * @param {!ESTree.Node} node
+   */
+  function beforeVisit(node) {
+    if (node.type === 'ClassDeclaration') {
+      reportClass(/** @type {!ESTree.Node} */ (node.id));
+    } else if (node.type === 'VariableDeclarator' && isClassNode(node.init)) {
+      reportClass(/** @type {!ESTree.Node} */ (node.id));
+    } else if (node.type === 'AssignmentExpression' && isNameNode(node.left) && isClassNode(node.right)) {
+      reportClass(/** @type {!ESTree.Node} */ (node.left));
+    } else if (node.type === 'Property' && isNameNode(node.key) && isClassNode(node.value)) {
+      reportClass(/** @type {!ESTree.Node} */ (node.key));
+    } else if (node.type === 'FunctionDeclaration') {
+      reportFunction(/** @type {!ESTree.Node} */ (node.id), node);
+    } else if (node.type === 'VariableDeclarator' && isFunctionNode(node.init)) {
+      reportFunction(/** @type {!ESTree.Node} */ (node.id), /** @type {!ESTree.Node} */ (node.init));
+    } else if (node.type === 'AssignmentExpression' && isNameNode(node.left) && isFunctionNode(node.right)) {
+      reportFunction(/** @type {!ESTree.Node} */ (node.left), /** @type {!ESTree.Node} */ (node.right));
     } else if (
-        AT.keyword(token, 'function') && previousIdentifier && previousToken && AT.punctuator(previousToken, ':=')) {
-      // Anonymous function assigned to an identifier: "...f = function..."
-      // or "funcName: function...".
-      currentFunction = {
-        line: tokenizer.tokenLineStart(),
-        column: tokenizer.tokenColumnStart(),
-        name: previousIdentifier
-      };
-      addedFunction = true;
-      previousIdentifier = null;
-    } else if (AT.punctuator(token, '.') && previousToken && AT.identifier(previousToken)) {
-      previousIdentifier += '.';
-    } else if (AT.punctuator(token, '(') && addedFunction) {
-      isReadingArguments = true;
-    }
-    if (isReadingArguments && tokenValue)
-      argumentsText += tokenValue;
-
-    if (AT.punctuator(token, ')') && isReadingArguments) {
-      addedFunction = false;
-      isReadingArguments = false;
-      currentFunction.arguments = argumentsText.replace(/,[\r\n\s]*/g, ', ').replace(/([^,])[\r\n\s]+/g, '$1');
-      argumentsText = '';
-      outlineChunk.push(currentFunction);
-    }
-
-    previousToken = token;
-    processedChunkCharacters += token.end - token.start;
-
-    if (processedChunkCharacters >= chunkSize) {
-      postMessage({chunk: outlineChunk, isLastChunk: false});
-      outlineChunk = [];
-      processedChunkCharacters = 0;
+        (node.type === 'MethodDefinition' || node.type === 'Property') && isNameNode(node.key) &&
+        isFunctionNode(node.value)) {
+      var namePrefix = [];
+      if (node.kind === 'get' || node.kind === 'set')
+        namePrefix.push(node.kind);
+      if (node.static)
+        namePrefix.push('static');
+      reportFunction(node.key, node.value, namePrefix.join(' '));
     }
   }
 
-  postMessage({chunk: outlineChunk, isLastChunk: true});
+  /**
+   * @param {!ESTree.Node} nameNode
+   */
+  function reportClass(nameNode) {
+    var name = 'class ' + stringifyNameNode(nameNode);
+    textCursor.advance(nameNode.start);
+    addOutlineItem({
+      name: name,
+      line: textCursor.lineNumber(),
+      column: textCursor.columnNumber(),
+    });
+  }
+
+  /**
+   * @param {!ESTree.Node} nameNode
+   * @param {!ESTree.Node} functionNode
+   * @param {string=} namePrefix
+   */
+  function reportFunction(nameNode, functionNode, namePrefix) {
+    var name = stringifyNameNode(nameNode);
+    if (functionNode.generator)
+      name = '*' + name;
+    if (namePrefix)
+      name = namePrefix + ' ' + name;
+    if (functionNode.async)
+      name = 'async ' + name;
+
+    textCursor.advance(nameNode.start);
+    addOutlineItem({
+      name: name,
+      line: textCursor.lineNumber(),
+      column: textCursor.columnNumber(),
+      arguments: stringifyArguments(/** @type {!Array<!ESTree.Node>} */ (functionNode.params))
+    });
+  }
+
+  /**
+   * @param {(!ESTree.Node|undefined)} node
+   * @return {boolean}
+   */
+  function isNameNode(node) {
+    if (!node)
+      return false;
+    if (node.type === 'MemberExpression')
+      return !node.computed && node.property.type === 'Identifier';
+    return node.type === 'Identifier';
+  }
+
+  /**
+   * @param {(!ESTree.Node|undefined)} node
+   * @return {boolean}
+   */
+  function isFunctionNode(node) {
+    if (!node)
+      return false;
+    return node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression';
+  }
+
+  /**
+   * @param {(!ESTree.Node|undefined)} node
+   * @return {boolean}
+   */
+  function isClassNode(node) {
+    return !!node && node.type === 'ClassExpression';
+  }
+
+  /**
+   * @param {!ESTree.Node} node
+   * @return {string}
+   */
+  function stringifyNameNode(node) {
+    if (node.type === 'MemberExpression')
+      node = /** @type {!ESTree.Node} */ (node.property);
+    console.assert(node.type === 'Identifier', 'Cannot extract identifier from unknown type: ' + node.type);
+    return /** @type {string} */ (node.name);
+  }
+
+  /**
+   * @param {!Array<!ESTree.Node>} params
+   * @return {string}
+   */
+  function stringifyArguments(params) {
+    var result = [];
+    for (var param of params) {
+      if (param.type === 'Identifier')
+        result.push(param.name);
+      else if (param.type === 'RestElement' && param.argument.type === 'Identifier')
+        result.push('...' + param.argument.name);
+      else
+        console.error('Error: unexpected function parameter type: ' + param.type);
+    }
+    return '(' + result.join(', ') + ')';
+  }
+
+  /**
+   * @param {{name: string, line: number, column: number, arguments: (string|undefined)}} item
+   */
+  function addOutlineItem(item) {
+    outlineChunk.push(item);
+    if (textCursor.offset() - lastReportedOffset < chunkSize)
+      return;
+    postMessage({chunk: outlineChunk, isLastChunk: false});
+    outlineChunk = [];
+    lastReportedOffset = textCursor.offset();
+  }
 };
diff --git a/third_party/WebKit/Source/devtools/front_end/formatter_worker/acorn/acorn.js b/third_party/WebKit/Source/devtools/front_end/formatter_worker/acorn/acorn.js
index c4d500d..5d10b53 100644
--- a/third_party/WebKit/Source/devtools/front_end/formatter_worker/acorn/acorn.js
+++ b/third_party/WebKit/Source/devtools/front_end/formatter_worker/acorn/acorn.js
@@ -1,3 +1,4 @@
+// clang-format off
 (function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
   typeof define === 'function' && define.amd ? define(['exports'], factory) :
@@ -3403,4 +3404,5 @@
 
 Object.defineProperty(exports, '__esModule', { value: true });
 
-})));
\ No newline at end of file
+})));
+// clang-format on
diff --git a/third_party/WebKit/Source/devtools/front_end/formatter_worker/acorn/acorn_loose.js b/third_party/WebKit/Source/devtools/front_end/formatter_worker/acorn/acorn_loose.js
new file mode 100644
index 0000000..6f372da
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/formatter_worker/acorn/acorn_loose.js
@@ -0,0 +1,1378 @@
+// clang-format off
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('./acorn')) :
+  typeof define === 'function' && define.amd ? define(['exports', './acorn'], factory) :
+  (factory((global.acorn = global.acorn || {}, global.acorn.loose = global.acorn.loose || {}),global.acorn));
+}(this, (function (exports,__acorn) { 'use strict';
+
+// Registered plugins
+var pluginsLoose = {}
+
+var LooseParser = function LooseParser(input, options) {
+  if ( options === void 0 ) options = {};
+
+  this.toks = __acorn.tokenizer(input, options)
+  this.options = this.toks.options
+  this.input = this.toks.input
+  this.tok = this.last = {type: __acorn.tokTypes.eof, start: 0, end: 0}
+  if (this.options.locations) {
+    var here = this.toks.curPosition()
+    this.tok.loc = new __acorn.SourceLocation(this.toks, here, here)
+  }
+  this.ahead = [] // Tokens ahead
+  this.context = [] // Indentation contexted
+  this.curIndent = 0
+  this.curLineStart = 0
+  this.nextLineStart = this.lineEnd(this.curLineStart) + 1
+  this.inAsync = false
+  // Load plugins
+  this.options.pluginsLoose = options.pluginsLoose || {}
+  this.loadPlugins(this.options.pluginsLoose)
+};
+
+LooseParser.prototype.startNode = function startNode () {
+  return new __acorn.Node(this.toks, this.tok.start, this.options.locations ? this.tok.loc.start : null)
+};
+
+LooseParser.prototype.storeCurrentPos = function storeCurrentPos () {
+  return this.options.locations ? [this.tok.start, this.tok.loc.start] : this.tok.start
+};
+
+LooseParser.prototype.startNodeAt = function startNodeAt (pos) {
+  if (this.options.locations) {
+    return new __acorn.Node(this.toks, pos[0], pos[1])
+  } else {
+    return new __acorn.Node(this.toks, pos)
+  }
+};
+
+LooseParser.prototype.finishNode = function finishNode (node, type) {
+  node.type = type
+  node.end = this.last.end
+  if (this.options.locations)
+    node.loc.end = this.last.loc.end
+  if (this.options.ranges)
+    node.range[1] = this.last.end
+  return node
+};
+
+LooseParser.prototype.dummyNode = function dummyNode (type) {
+  var dummy = this.startNode()
+  dummy.type = type
+  dummy.end = dummy.start
+  if (this.options.locations)
+    dummy.loc.end = dummy.loc.start
+  if (this.options.ranges)
+    dummy.range[1] = dummy.start
+  this.last = {type: __acorn.tokTypes.name, start: dummy.start, end: dummy.start, loc: dummy.loc}
+  return dummy
+};
+
+LooseParser.prototype.dummyIdent = function dummyIdent () {
+  var dummy = this.dummyNode("Identifier")
+  dummy.name = "✖"
+  return dummy
+};
+
+LooseParser.prototype.dummyString = function dummyString () {
+  var dummy = this.dummyNode("Literal")
+  dummy.value = dummy.raw = "✖"
+  return dummy
+};
+
+LooseParser.prototype.eat = function eat (type) {
+  if (this.tok.type === type) {
+    this.next()
+    return true
+  } else {
+    return false
+  }
+};
+
+LooseParser.prototype.isContextual = function isContextual (name) {
+  return this.tok.type === __acorn.tokTypes.name && this.tok.value === name
+};
+
+LooseParser.prototype.eatContextual = function eatContextual (name) {
+  return this.tok.value === name && this.eat(__acorn.tokTypes.name)
+};
+
+LooseParser.prototype.canInsertSemicolon = function canInsertSemicolon () {
+  return this.tok.type === __acorn.tokTypes.eof || this.tok.type === __acorn.tokTypes.braceR ||
+    __acorn.lineBreak.test(this.input.slice(this.last.end, this.tok.start))
+};
+
+LooseParser.prototype.semicolon = function semicolon () {
+  return this.eat(__acorn.tokTypes.semi)
+};
+
+LooseParser.prototype.expect = function expect (type) {
+    var this$1 = this;
+
+  if (this.eat(type)) return true
+  for (var i = 1; i <= 2; i++) {
+    if (this$1.lookAhead(i).type == type) {
+      for (var j = 0; j < i; j++) this$1.next()
+      return true
+    }
+  }
+};
+
+LooseParser.prototype.pushCx = function pushCx () {
+  this.context.push(this.curIndent)
+};
+
+LooseParser.prototype.popCx = function popCx () {
+  this.curIndent = this.context.pop()
+};
+
+LooseParser.prototype.lineEnd = function lineEnd (pos) {
+  while (pos < this.input.length && !__acorn.isNewLine(this.input.charCodeAt(pos))) ++pos
+  return pos
+};
+
+LooseParser.prototype.indentationAfter = function indentationAfter (pos) {
+    var this$1 = this;
+
+  for (var count = 0;; ++pos) {
+    var ch = this$1.input.charCodeAt(pos)
+    if (ch === 32) ++count
+    else if (ch === 9) count += this$1.options.tabSize
+    else return count
+  }
+};
+
+LooseParser.prototype.closes = function closes (closeTok, indent, line, blockHeuristic) {
+  if (this.tok.type === closeTok || this.tok.type === __acorn.tokTypes.eof) return true
+  return line != this.curLineStart && this.curIndent < indent && this.tokenStartsLine() &&
+    (!blockHeuristic || this.nextLineStart >= this.input.length ||
+     this.indentationAfter(this.nextLineStart) < indent)
+};
+
+LooseParser.prototype.tokenStartsLine = function tokenStartsLine () {
+    var this$1 = this;
+
+  for (var p = this.tok.start - 1; p >= this.curLineStart; --p) {
+    var ch = this$1.input.charCodeAt(p)
+    if (ch !== 9 && ch !== 32) return false
+  }
+  return true
+};
+
+LooseParser.prototype.extend = function extend (name, f) {
+  this[name] = f(this[name])
+};
+
+LooseParser.prototype.loadPlugins = function loadPlugins (pluginConfigs) {
+    var this$1 = this;
+
+  for (var name in pluginConfigs) {
+    var plugin = pluginsLoose[name]
+    if (!plugin) throw new Error("Plugin '" + name + "' not found")
+    plugin(this$1, pluginConfigs[name])
+  }
+};
+
+var lp = LooseParser.prototype
+
+function isSpace(ch) {
+  return (ch < 14 && ch > 8) || ch === 32 || ch === 160 || __acorn.isNewLine(ch)
+}
+
+lp.next = function() {
+  var this$1 = this;
+
+  this.last = this.tok
+  if (this.ahead.length)
+    this.tok = this.ahead.shift()
+  else
+    this.tok = this.readToken()
+
+  if (this.tok.start >= this.nextLineStart) {
+    while (this.tok.start >= this.nextLineStart) {
+      this$1.curLineStart = this$1.nextLineStart
+      this$1.nextLineStart = this$1.lineEnd(this$1.curLineStart) + 1
+    }
+    this.curIndent = this.indentationAfter(this.curLineStart)
+  }
+}
+
+lp.readToken = function() {
+  var this$1 = this;
+
+  for (;;) {
+    try {
+      this$1.toks.next()
+      if (this$1.toks.type === __acorn.tokTypes.dot &&
+          this$1.input.substr(this$1.toks.end, 1) === "." &&
+          this$1.options.ecmaVersion >= 6) {
+        this$1.toks.end++
+        this$1.toks.type = __acorn.tokTypes.ellipsis
+      }
+      return new __acorn.Token(this$1.toks)
+    } catch (e) {
+      if (!(e instanceof SyntaxError)) throw e
+
+      // Try to skip some text, based on the error message, and then continue
+      var msg = e.message, pos = e.raisedAt, replace = true
+      if (/unterminated/i.test(msg)) {
+        pos = this$1.lineEnd(e.pos + 1)
+        if (/string/.test(msg)) {
+          replace = {start: e.pos, end: pos, type: __acorn.tokTypes.string, value: this$1.input.slice(e.pos + 1, pos)}
+        } else if (/regular expr/i.test(msg)) {
+          var re = this$1.input.slice(e.pos, pos)
+          try { re = new RegExp(re) } catch (e) { /* ignore compilation error due to new syntax */ }
+          replace = {start: e.pos, end: pos, type: __acorn.tokTypes.regexp, value: re}
+        } else if (/template/.test(msg)) {
+          replace = {
+            start: e.pos,
+            end: pos,
+            type: __acorn.tokTypes.template,
+            value: this$1.input.slice(e.pos, pos)
+          }
+        } else {
+          replace = false
+        }
+      } else if (/invalid (unicode|regexp|number)|expecting unicode|octal literal|is reserved|directly after number|expected number in radix/i.test(msg)) {
+        while (pos < this.input.length && !isSpace(this.input.charCodeAt(pos))) ++pos
+      } else if (/character escape|expected hexadecimal/i.test(msg)) {
+        while (pos < this.input.length) {
+          var ch = this$1.input.charCodeAt(pos++)
+          if (ch === 34 || ch === 39 || __acorn.isNewLine(ch)) break
+        }
+      } else if (/unexpected character/i.test(msg)) {
+        pos++
+        replace = false
+      } else if (/regular expression/i.test(msg)) {
+        replace = true
+      } else {
+        throw e
+      }
+      this$1.resetTo(pos)
+      if (replace === true) replace = {start: pos, end: pos, type: __acorn.tokTypes.name, value: "✖"}
+      if (replace) {
+        if (this$1.options.locations)
+          replace.loc = new __acorn.SourceLocation(
+            this$1.toks,
+            __acorn.getLineInfo(this$1.input, replace.start),
+            __acorn.getLineInfo(this$1.input, replace.end))
+        return replace
+      }
+    }
+  }
+}
+
+lp.resetTo = function(pos) {
+  var this$1 = this;
+
+  this.toks.pos = pos
+  var ch = this.input.charAt(pos - 1)
+  this.toks.exprAllowed = !ch || /[[{(,;:?/*=+\-~!|&%^<>]/.test(ch) ||
+    /[enwfd]/.test(ch) &&
+    /\b(keywords|case|else|return|throw|new|in|(instance|type)of|delete|void)$/.test(this.input.slice(pos - 10, pos))
+
+  if (this.options.locations) {
+    this.toks.curLine = 1
+    this.toks.lineStart = __acorn.lineBreakG.lastIndex = 0
+    var match
+    while ((match = __acorn.lineBreakG.exec(this.input)) && match.index < pos) {
+      ++this$1.toks.curLine
+      this$1.toks.lineStart = match.index + match[0].length
+    }
+  }
+}
+
+lp.lookAhead = function(n) {
+  var this$1 = this;
+
+  while (n > this.ahead.length)
+    this$1.ahead.push(this$1.readToken())
+  return this.ahead[n - 1]
+}
+
+function isDummy(node) { return node.name == "✖" }
+
+var lp$1 = LooseParser.prototype
+
+lp$1.parseTopLevel = function() {
+  var this$1 = this;
+
+  var node = this.startNodeAt(this.options.locations ? [0, __acorn.getLineInfo(this.input, 0)] : 0)
+  node.body = []
+  while (this.tok.type !== __acorn.tokTypes.eof) node.body.push(this$1.parseStatement())
+  this.last = this.tok
+  if (this.options.ecmaVersion >= 6) {
+    node.sourceType = this.options.sourceType
+  }
+  return this.finishNode(node, "Program")
+}
+
+lp$1.parseStatement = function() {
+  var this$1 = this;
+
+  var starttype = this.tok.type, node = this.startNode(), kind
+
+  if (this.toks.isLet()) {
+    starttype = __acorn.tokTypes._var
+    kind = "let"
+  }
+
+  switch (starttype) {
+  case __acorn.tokTypes._break: case __acorn.tokTypes._continue:
+    this.next()
+    var isBreak = starttype === __acorn.tokTypes._break
+    if (this.semicolon() || this.canInsertSemicolon()) {
+      node.label = null
+    } else {
+      node.label = this.tok.type === __acorn.tokTypes.name ? this.parseIdent() : null
+      this.semicolon()
+    }
+    return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement")
+
+  case __acorn.tokTypes._debugger:
+    this.next()
+    this.semicolon()
+    return this.finishNode(node, "DebuggerStatement")
+
+  case __acorn.tokTypes._do:
+    this.next()
+    node.body = this.parseStatement()
+    node.test = this.eat(__acorn.tokTypes._while) ? this.parseParenExpression() : this.dummyIdent()
+    this.semicolon()
+    return this.finishNode(node, "DoWhileStatement")
+
+  case __acorn.tokTypes._for:
+    this.next()
+    this.pushCx()
+    this.expect(__acorn.tokTypes.parenL)
+    if (this.tok.type === __acorn.tokTypes.semi) return this.parseFor(node, null)
+    var isLet = this.toks.isLet()
+    if (isLet || this.tok.type === __acorn.tokTypes._var || this.tok.type === __acorn.tokTypes._const) {
+      var init$1 = this.parseVar(true, isLet ? "let" : this.tok.value)
+      if (init$1.declarations.length === 1 && (this.tok.type === __acorn.tokTypes._in || this.isContextual("of"))) {
+        return this.parseForIn(node, init$1)
+      }
+      return this.parseFor(node, init$1)
+    }
+    var init = this.parseExpression(true)
+    if (this.tok.type === __acorn.tokTypes._in || this.isContextual("of"))
+      return this.parseForIn(node, this.toAssignable(init))
+    return this.parseFor(node, init)
+
+  case __acorn.tokTypes._function:
+    this.next()
+    return this.parseFunction(node, true)
+
+  case __acorn.tokTypes._if:
+    this.next()
+    node.test = this.parseParenExpression()
+    node.consequent = this.parseStatement()
+    node.alternate = this.eat(__acorn.tokTypes._else) ? this.parseStatement() : null
+    return this.finishNode(node, "IfStatement")
+
+  case __acorn.tokTypes._return:
+    this.next()
+    if (this.eat(__acorn.tokTypes.semi) || this.canInsertSemicolon()) node.argument = null
+    else { node.argument = this.parseExpression(); this.semicolon() }
+    return this.finishNode(node, "ReturnStatement")
+
+  case __acorn.tokTypes._switch:
+    var blockIndent = this.curIndent, line = this.curLineStart
+    this.next()
+    node.discriminant = this.parseParenExpression()
+    node.cases = []
+    this.pushCx()
+    this.expect(__acorn.tokTypes.braceL)
+
+    var cur
+    while (!this.closes(__acorn.tokTypes.braceR, blockIndent, line, true)) {
+      if (this$1.tok.type === __acorn.tokTypes._case || this$1.tok.type === __acorn.tokTypes._default) {
+        var isCase = this$1.tok.type === __acorn.tokTypes._case
+        if (cur) this$1.finishNode(cur, "SwitchCase")
+        node.cases.push(cur = this$1.startNode())
+        cur.consequent = []
+        this$1.next()
+        if (isCase) cur.test = this$1.parseExpression()
+        else cur.test = null
+        this$1.expect(__acorn.tokTypes.colon)
+      } else {
+        if (!cur) {
+          node.cases.push(cur = this$1.startNode())
+          cur.consequent = []
+          cur.test = null
+        }
+        cur.consequent.push(this$1.parseStatement())
+      }
+    }
+    if (cur) this.finishNode(cur, "SwitchCase")
+    this.popCx()
+    this.eat(__acorn.tokTypes.braceR)
+    return this.finishNode(node, "SwitchStatement")
+
+  case __acorn.tokTypes._throw:
+    this.next()
+    node.argument = this.parseExpression()
+    this.semicolon()
+    return this.finishNode(node, "ThrowStatement")
+
+  case __acorn.tokTypes._try:
+    this.next()
+    node.block = this.parseBlock()
+    node.handler = null
+    if (this.tok.type === __acorn.tokTypes._catch) {
+      var clause = this.startNode()
+      this.next()
+      this.expect(__acorn.tokTypes.parenL)
+      clause.param = this.toAssignable(this.parseExprAtom(), true)
+      this.expect(__acorn.tokTypes.parenR)
+      clause.body = this.parseBlock()
+      node.handler = this.finishNode(clause, "CatchClause")
+    }
+    node.finalizer = this.eat(__acorn.tokTypes._finally) ? this.parseBlock() : null
+    if (!node.handler && !node.finalizer) return node.block
+    return this.finishNode(node, "TryStatement")
+
+  case __acorn.tokTypes._var:
+  case __acorn.tokTypes._const:
+    return this.parseVar(false, kind || this.tok.value)
+
+  case __acorn.tokTypes._while:
+    this.next()
+    node.test = this.parseParenExpression()
+    node.body = this.parseStatement()
+    return this.finishNode(node, "WhileStatement")
+
+  case __acorn.tokTypes._with:
+    this.next()
+    node.object = this.parseParenExpression()
+    node.body = this.parseStatement()
+    return this.finishNode(node, "WithStatement")
+
+  case __acorn.tokTypes.braceL:
+    return this.parseBlock()
+
+  case __acorn.tokTypes.semi:
+    this.next()
+    return this.finishNode(node, "EmptyStatement")
+
+  case __acorn.tokTypes._class:
+    return this.parseClass(true)
+
+  case __acorn.tokTypes._import:
+    return this.parseImport()
+
+  case __acorn.tokTypes._export:
+    return this.parseExport()
+
+  default:
+    if (this.toks.isAsyncFunction()) {
+      this.next()
+      this.next()
+      return this.parseFunction(node, true, true)
+    }
+    var expr = this.parseExpression()
+    if (isDummy(expr)) {
+      this.next()
+      if (this.tok.type === __acorn.tokTypes.eof) return this.finishNode(node, "EmptyStatement")
+      return this.parseStatement()
+    } else if (starttype === __acorn.tokTypes.name && expr.type === "Identifier" && this.eat(__acorn.tokTypes.colon)) {
+      node.body = this.parseStatement()
+      node.label = expr
+      return this.finishNode(node, "LabeledStatement")
+    } else {
+      node.expression = expr
+      this.semicolon()
+      return this.finishNode(node, "ExpressionStatement")
+    }
+  }
+}
+
+lp$1.parseBlock = function() {
+  var this$1 = this;
+
+  var node = this.startNode()
+  this.pushCx()
+  this.expect(__acorn.tokTypes.braceL)
+  var blockIndent = this.curIndent, line = this.curLineStart
+  node.body = []
+  while (!this.closes(__acorn.tokTypes.braceR, blockIndent, line, true))
+    node.body.push(this$1.parseStatement())
+  this.popCx()
+  this.eat(__acorn.tokTypes.braceR)
+  return this.finishNode(node, "BlockStatement")
+}
+
+lp$1.parseFor = function(node, init) {
+  node.init = init
+  node.test = node.update = null
+  if (this.eat(__acorn.tokTypes.semi) && this.tok.type !== __acorn.tokTypes.semi) node.test = this.parseExpression()
+  if (this.eat(__acorn.tokTypes.semi) && this.tok.type !== __acorn.tokTypes.parenR) node.update = this.parseExpression()
+  this.popCx()
+  this.expect(__acorn.tokTypes.parenR)
+  node.body = this.parseStatement()
+  return this.finishNode(node, "ForStatement")
+}
+
+lp$1.parseForIn = function(node, init) {
+  var type = this.tok.type === __acorn.tokTypes._in ? "ForInStatement" : "ForOfStatement"
+  this.next()
+  node.left = init
+  node.right = this.parseExpression()
+  this.popCx()
+  this.expect(__acorn.tokTypes.parenR)
+  node.body = this.parseStatement()
+  return this.finishNode(node, type)
+}
+
+lp$1.parseVar = function(noIn, kind) {
+  var this$1 = this;
+
+  var node = this.startNode()
+  node.kind = kind
+  this.next()
+  node.declarations = []
+  do {
+    var decl = this$1.startNode()
+    decl.id = this$1.options.ecmaVersion >= 6 ? this$1.toAssignable(this$1.parseExprAtom(), true) : this$1.parseIdent()
+    decl.init = this$1.eat(__acorn.tokTypes.eq) ? this$1.parseMaybeAssign(noIn) : null
+    node.declarations.push(this$1.finishNode(decl, "VariableDeclarator"))
+  } while (this.eat(__acorn.tokTypes.comma))
+  if (!node.declarations.length) {
+    var decl$1 = this.startNode()
+    decl$1.id = this.dummyIdent()
+    node.declarations.push(this.finishNode(decl$1, "VariableDeclarator"))
+  }
+  if (!noIn) this.semicolon()
+  return this.finishNode(node, "VariableDeclaration")
+}
+
+lp$1.parseClass = function(isStatement) {
+  var this$1 = this;
+
+  var node = this.startNode()
+  this.next()
+  if (this.tok.type === __acorn.tokTypes.name) node.id = this.parseIdent()
+  else if (isStatement === true) node.id = this.dummyIdent()
+  else node.id = null
+  node.superClass = this.eat(__acorn.tokTypes._extends) ? this.parseExpression() : null
+  node.body = this.startNode()
+  node.body.body = []
+  this.pushCx()
+  var indent = this.curIndent + 1, line = this.curLineStart
+  this.eat(__acorn.tokTypes.braceL)
+  if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart }
+  while (!this.closes(__acorn.tokTypes.braceR, indent, line)) {
+    if (this$1.semicolon()) continue
+    var method = this$1.startNode(), isGenerator, isAsync
+    if (this$1.options.ecmaVersion >= 6) {
+      method.static = false
+      isGenerator = this$1.eat(__acorn.tokTypes.star)
+    }
+    this$1.parsePropertyName(method)
+    if (isDummy(method.key)) { if (isDummy(this$1.parseMaybeAssign())) this$1.next(); this$1.eat(__acorn.tokTypes.comma); continue }
+    if (method.key.type === "Identifier" && !method.computed && method.key.name === "static" &&
+        (this$1.tok.type != __acorn.tokTypes.parenL && this$1.tok.type != __acorn.tokTypes.braceL)) {
+      method.static = true
+      isGenerator = this$1.eat(__acorn.tokTypes.star)
+      this$1.parsePropertyName(method)
+    } else {
+      method.static = false
+    }
+    if (!method.computed &&
+        method.key.type === "Identifier" && method.key.name === "async" && this$1.tok.type !== __acorn.tokTypes.parenL &&
+        !this$1.canInsertSemicolon()) {
+      this$1.parsePropertyName(method)
+      isAsync = true
+    } else {
+      isAsync = false
+    }
+    if (this$1.options.ecmaVersion >= 5 && method.key.type === "Identifier" &&
+        !method.computed && (method.key.name === "get" || method.key.name === "set") &&
+        this$1.tok.type !== __acorn.tokTypes.parenL && this$1.tok.type !== __acorn.tokTypes.braceL) {
+      method.kind = method.key.name
+      this$1.parsePropertyName(method)
+      method.value = this$1.parseMethod(false)
+    } else {
+      if (!method.computed && !method.static && !isGenerator && !isAsync && (
+        method.key.type === "Identifier" && method.key.name === "constructor" ||
+          method.key.type === "Literal" && method.key.value === "constructor")) {
+        method.kind = "constructor"
+      } else {
+        method.kind = "method"
+      }
+      method.value = this$1.parseMethod(isGenerator, isAsync)
+    }
+    node.body.body.push(this$1.finishNode(method, "MethodDefinition"))
+  }
+  this.popCx()
+  if (!this.eat(__acorn.tokTypes.braceR)) {
+    // If there is no closing brace, make the node span to the start
+    // of the next token (this is useful for Tern)
+    this.last.end = this.tok.start
+    if (this.options.locations) this.last.loc.end = this.tok.loc.start
+  }
+  this.semicolon()
+  this.finishNode(node.body, "ClassBody")
+  return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression")
+}
+
+lp$1.parseFunction = function(node, isStatement, isAsync) {
+  var oldInAsync = this.inAsync
+  this.initFunction(node)
+  if (this.options.ecmaVersion >= 6) {
+    node.generator = this.eat(__acorn.tokTypes.star)
+  }
+  if (this.options.ecmaVersion >= 8) {
+    node.async = !!isAsync
+  }
+  if (this.tok.type === __acorn.tokTypes.name) node.id = this.parseIdent()
+  else if (isStatement === true) node.id = this.dummyIdent()
+  this.inAsync = node.async
+  node.params = this.parseFunctionParams()
+  node.body = this.parseBlock()
+  this.inAsync = oldInAsync
+  return this.finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression")
+}
+
+lp$1.parseExport = function() {
+  var node = this.startNode()
+  this.next()
+  if (this.eat(__acorn.tokTypes.star)) {
+    node.source = this.eatContextual("from") ? this.parseExprAtom() : this.dummyString()
+    return this.finishNode(node, "ExportAllDeclaration")
+  }
+  if (this.eat(__acorn.tokTypes._default)) {
+    // export default (function foo() {}) // This is FunctionExpression.
+    var isAsync
+    if (this.tok.type === __acorn.tokTypes._function || (isAsync = this.toks.isAsyncFunction())) {
+      var fNode = this.startNode()
+      this.next()
+      if (isAsync) this.next()
+      node.declaration = this.parseFunction(fNode, "nullableID", isAsync)
+    } else if (this.tok.type === __acorn.tokTypes._class) {
+      node.declaration = this.parseClass("nullableID")
+    } else {
+      node.declaration = this.parseMaybeAssign()
+      this.semicolon()
+    }
+    return this.finishNode(node, "ExportDefaultDeclaration")
+  }
+  if (this.tok.type.keyword || this.toks.isLet() || this.toks.isAsyncFunction()) {
+    node.declaration = this.parseStatement()
+    node.specifiers = []
+    node.source = null
+  } else {
+    node.declaration = null
+    node.specifiers = this.parseExportSpecifierList()
+    node.source = this.eatContextual("from") ? this.parseExprAtom() : null
+    this.semicolon()
+  }
+  return this.finishNode(node, "ExportNamedDeclaration")
+}
+
+lp$1.parseImport = function() {
+  var node = this.startNode()
+  this.next()
+  if (this.tok.type === __acorn.tokTypes.string) {
+    node.specifiers = []
+    node.source = this.parseExprAtom()
+    node.kind = ""
+  } else {
+    var elt
+    if (this.tok.type === __acorn.tokTypes.name && this.tok.value !== "from") {
+      elt = this.startNode()
+      elt.local = this.parseIdent()
+      this.finishNode(elt, "ImportDefaultSpecifier")
+      this.eat(__acorn.tokTypes.comma)
+    }
+    node.specifiers = this.parseImportSpecifierList()
+    node.source = this.eatContextual("from") && this.tok.type == __acorn.tokTypes.string ? this.parseExprAtom() : this.dummyString()
+    if (elt) node.specifiers.unshift(elt)
+  }
+  this.semicolon()
+  return this.finishNode(node, "ImportDeclaration")
+}
+
+lp$1.parseImportSpecifierList = function() {
+  var this$1 = this;
+
+  var elts = []
+  if (this.tok.type === __acorn.tokTypes.star) {
+    var elt = this.startNode()
+    this.next()
+    elt.local = this.eatContextual("as") ? this.parseIdent() : this.dummyIdent()
+    elts.push(this.finishNode(elt, "ImportNamespaceSpecifier"))
+  } else {
+    var indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart
+    this.pushCx()
+    this.eat(__acorn.tokTypes.braceL)
+    if (this.curLineStart > continuedLine) continuedLine = this.curLineStart
+    while (!this.closes(__acorn.tokTypes.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) {
+      var elt$1 = this$1.startNode()
+      if (this$1.eat(__acorn.tokTypes.star)) {
+        elt$1.local = this$1.eatContextual("as") ? this$1.parseIdent() : this$1.dummyIdent()
+        this$1.finishNode(elt$1, "ImportNamespaceSpecifier")
+      } else {
+        if (this$1.isContextual("from")) break
+        elt$1.imported = this$1.parseIdent()
+        if (isDummy(elt$1.imported)) break
+        elt$1.local = this$1.eatContextual("as") ? this$1.parseIdent() : elt$1.imported
+        this$1.finishNode(elt$1, "ImportSpecifier")
+      }
+      elts.push(elt$1)
+      this$1.eat(__acorn.tokTypes.comma)
+    }
+    this.eat(__acorn.tokTypes.braceR)
+    this.popCx()
+  }
+  return elts
+}
+
+lp$1.parseExportSpecifierList = function() {
+  var this$1 = this;
+
+  var elts = []
+  var indent = this.curIndent, line = this.curLineStart, continuedLine = this.nextLineStart
+  this.pushCx()
+  this.eat(__acorn.tokTypes.braceL)
+  if (this.curLineStart > continuedLine) continuedLine = this.curLineStart
+  while (!this.closes(__acorn.tokTypes.braceR, indent + (this.curLineStart <= continuedLine ? 1 : 0), line)) {
+    if (this$1.isContextual("from")) break
+    var elt = this$1.startNode()
+    elt.local = this$1.parseIdent()
+    if (isDummy(elt.local)) break
+    elt.exported = this$1.eatContextual("as") ? this$1.parseIdent() : elt.local
+    this$1.finishNode(elt, "ExportSpecifier")
+    elts.push(elt)
+    this$1.eat(__acorn.tokTypes.comma)
+  }
+  this.eat(__acorn.tokTypes.braceR)
+  this.popCx()
+  return elts
+}
+
+var lp$2 = LooseParser.prototype
+
+lp$2.checkLVal = function(expr) {
+  if (!expr) return expr
+  switch (expr.type) {
+  case "Identifier":
+  case "MemberExpression":
+    return expr
+
+  case "ParenthesizedExpression":
+    expr.expression = this.checkLVal(expr.expression)
+    return expr
+
+  default:
+    return this.dummyIdent()
+  }
+}
+
+lp$2.parseExpression = function(noIn) {
+  var this$1 = this;
+
+  var start = this.storeCurrentPos()
+  var expr = this.parseMaybeAssign(noIn)
+  if (this.tok.type === __acorn.tokTypes.comma) {
+    var node = this.startNodeAt(start)
+    node.expressions = [expr]
+    while (this.eat(__acorn.tokTypes.comma)) node.expressions.push(this$1.parseMaybeAssign(noIn))
+    return this.finishNode(node, "SequenceExpression")
+  }
+  return expr
+}
+
+lp$2.parseParenExpression = function() {
+  this.pushCx()
+  this.expect(__acorn.tokTypes.parenL)
+  var val = this.parseExpression()
+  this.popCx()
+  this.expect(__acorn.tokTypes.parenR)
+  return val
+}
+
+lp$2.parseMaybeAssign = function(noIn) {
+  if (this.toks.isContextual("yield")) {
+    var node = this.startNode()
+    this.next()
+    if (this.semicolon() || this.canInsertSemicolon() || (this.tok.type != __acorn.tokTypes.star && !this.tok.type.startsExpr)) {
+      node.delegate = false
+      node.argument = null
+    } else {
+      node.delegate = this.eat(__acorn.tokTypes.star)
+      node.argument = this.parseMaybeAssign()
+    }
+    return this.finishNode(node, "YieldExpression")
+  }
+
+  var start = this.storeCurrentPos()
+  var left = this.parseMaybeConditional(noIn)
+  if (this.tok.type.isAssign) {
+    var node$1 = this.startNodeAt(start)
+    node$1.operator = this.tok.value
+    node$1.left = this.tok.type === __acorn.tokTypes.eq ? this.toAssignable(left) : this.checkLVal(left)
+    this.next()
+    node$1.right = this.parseMaybeAssign(noIn)
+    return this.finishNode(node$1, "AssignmentExpression")
+  }
+  return left
+}
+
+lp$2.parseMaybeConditional = function(noIn) {
+  var start = this.storeCurrentPos()
+  var expr = this.parseExprOps(noIn)
+  if (this.eat(__acorn.tokTypes.question)) {
+    var node = this.startNodeAt(start)
+    node.test = expr
+    node.consequent = this.parseMaybeAssign()
+    node.alternate = this.expect(__acorn.tokTypes.colon) ? this.parseMaybeAssign(noIn) : this.dummyIdent()
+    return this.finishNode(node, "ConditionalExpression")
+  }
+  return expr
+}
+
+lp$2.parseExprOps = function(noIn) {
+  var start = this.storeCurrentPos()
+  var indent = this.curIndent, line = this.curLineStart
+  return this.parseExprOp(this.parseMaybeUnary(false), start, -1, noIn, indent, line)
+}
+
+lp$2.parseExprOp = function(left, start, minPrec, noIn, indent, line) {
+  if (this.curLineStart != line && this.curIndent < indent && this.tokenStartsLine()) return left
+  var prec = this.tok.type.binop
+  if (prec != null && (!noIn || this.tok.type !== __acorn.tokTypes._in)) {
+    if (prec > minPrec) {
+      var node = this.startNodeAt(start)
+      node.left = left
+      node.operator = this.tok.value
+      this.next()
+      if (this.curLineStart != line && this.curIndent < indent && this.tokenStartsLine()) {
+        node.right = this.dummyIdent()
+      } else {
+        var rightStart = this.storeCurrentPos()
+        node.right = this.parseExprOp(this.parseMaybeUnary(false), rightStart, prec, noIn, indent, line)
+      }
+      this.finishNode(node, /&&|\|\|/.test(node.operator) ? "LogicalExpression" : "BinaryExpression")
+      return this.parseExprOp(node, start, minPrec, noIn, indent, line)
+    }
+  }
+  return left
+}
+
+lp$2.parseMaybeUnary = function(sawUnary) {
+  var this$1 = this;
+
+  var start = this.storeCurrentPos(), expr
+  if (this.options.ecmaVersion >= 8 && this.inAsync && this.toks.isContextual("await")) {
+    expr = this.parseAwait()
+    sawUnary = true
+  } else if (this.tok.type.prefix) {
+    var node = this.startNode(), update = this.tok.type === __acorn.tokTypes.incDec
+    if (!update) sawUnary = true
+    node.operator = this.tok.value
+    node.prefix = true
+    this.next()
+    node.argument = this.parseMaybeUnary(true)
+    if (update) node.argument = this.checkLVal(node.argument)
+    expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression")
+  } else if (this.tok.type === __acorn.tokTypes.ellipsis) {
+    var node$1 = this.startNode()
+    this.next()
+    node$1.argument = this.parseMaybeUnary(sawUnary)
+    expr = this.finishNode(node$1, "SpreadElement")
+  } else {
+    expr = this.parseExprSubscripts()
+    while (this.tok.type.postfix && !this.canInsertSemicolon()) {
+      var node$2 = this$1.startNodeAt(start)
+      node$2.operator = this$1.tok.value
+      node$2.prefix = false
+      node$2.argument = this$1.checkLVal(expr)
+      this$1.next()
+      expr = this$1.finishNode(node$2, "UpdateExpression")
+    }
+  }
+
+  if (!sawUnary && this.eat(__acorn.tokTypes.starstar)) {
+    var node$3 = this.startNodeAt(start)
+    node$3.operator = "**"
+    node$3.left = expr
+    node$3.right = this.parseMaybeUnary(false)
+    return this.finishNode(node$3, "BinaryExpression")
+  }
+
+  return expr
+}
+
+lp$2.parseExprSubscripts = function() {
+  var start = this.storeCurrentPos()
+  return this.parseSubscripts(this.parseExprAtom(), start, false, this.curIndent, this.curLineStart)
+}
+
+lp$2.parseSubscripts = function(base, start, noCalls, startIndent, line) {
+  var this$1 = this;
+
+  for (;;) {
+    if (this$1.curLineStart != line && this$1.curIndent <= startIndent && this$1.tokenStartsLine()) {
+      if (this$1.tok.type == __acorn.tokTypes.dot && this$1.curIndent == startIndent)
+        --startIndent
+      else
+        return base
+    }
+
+    var maybeAsyncArrow = base.type === "Identifier" && base.name === "async" && !this$1.canInsertSemicolon()
+
+    if (this$1.eat(__acorn.tokTypes.dot)) {
+      var node = this$1.startNodeAt(start)
+      node.object = base
+      if (this$1.curLineStart != line && this$1.curIndent <= startIndent && this$1.tokenStartsLine())
+        node.property = this$1.dummyIdent()
+      else
+        node.property = this$1.parsePropertyAccessor() || this$1.dummyIdent()
+      node.computed = false
+      base = this$1.finishNode(node, "MemberExpression")
+    } else if (this$1.tok.type == __acorn.tokTypes.bracketL) {
+      this$1.pushCx()
+      this$1.next()
+      var node$1 = this$1.startNodeAt(start)
+      node$1.object = base
+      node$1.property = this$1.parseExpression()
+      node$1.computed = true
+      this$1.popCx()
+      this$1.expect(__acorn.tokTypes.bracketR)
+      base = this$1.finishNode(node$1, "MemberExpression")
+    } else if (!noCalls && this$1.tok.type == __acorn.tokTypes.parenL) {
+      var exprList = this$1.parseExprList(__acorn.tokTypes.parenR)
+      if (maybeAsyncArrow && this$1.eat(__acorn.tokTypes.arrow))
+        return this$1.parseArrowExpression(this$1.startNodeAt(start), exprList, true)
+      var node$2 = this$1.startNodeAt(start)
+      node$2.callee = base
+      node$2.arguments = exprList
+      base = this$1.finishNode(node$2, "CallExpression")
+    } else if (this$1.tok.type == __acorn.tokTypes.backQuote) {
+      var node$3 = this$1.startNodeAt(start)
+      node$3.tag = base
+      node$3.quasi = this$1.parseTemplate()
+      base = this$1.finishNode(node$3, "TaggedTemplateExpression")
+    } else {
+      return base
+    }
+  }
+}
+
+lp$2.parseExprAtom = function() {
+  var node
+  switch (this.tok.type) {
+  case __acorn.tokTypes._this:
+  case __acorn.tokTypes._super:
+    var type = this.tok.type === __acorn.tokTypes._this ? "ThisExpression" : "Super"
+    node = this.startNode()
+    this.next()
+    return this.finishNode(node, type)
+
+  case __acorn.tokTypes.name:
+    var start = this.storeCurrentPos()
+    var id = this.parseIdent()
+    var isAsync = false
+    if (id.name === "async" && !this.canInsertSemicolon()) {
+      if (this.eat(__acorn.tokTypes._function))
+        return this.parseFunction(this.startNodeAt(start), false, true)
+      if (this.tok.type === __acorn.tokTypes.name) {
+        id = this.parseIdent()
+        isAsync = true
+      }
+    }
+    return this.eat(__acorn.tokTypes.arrow) ? this.parseArrowExpression(this.startNodeAt(start), [id], isAsync) : id
+
+  case __acorn.tokTypes.regexp:
+    node = this.startNode()
+    var val = this.tok.value
+    node.regex = {pattern: val.pattern, flags: val.flags}
+    node.value = val.value
+    node.raw = this.input.slice(this.tok.start, this.tok.end)
+    this.next()
+    return this.finishNode(node, "Literal")
+
+  case __acorn.tokTypes.num: case __acorn.tokTypes.string:
+    node = this.startNode()
+    node.value = this.tok.value
+    node.raw = this.input.slice(this.tok.start, this.tok.end)
+    this.next()
+    return this.finishNode(node, "Literal")
+
+  case __acorn.tokTypes._null: case __acorn.tokTypes._true: case __acorn.tokTypes._false:
+    node = this.startNode()
+    node.value = this.tok.type === __acorn.tokTypes._null ? null : this.tok.type === __acorn.tokTypes._true
+    node.raw = this.tok.type.keyword
+    this.next()
+    return this.finishNode(node, "Literal")
+
+  case __acorn.tokTypes.parenL:
+    var parenStart = this.storeCurrentPos()
+    this.next()
+    var inner = this.parseExpression()
+    this.expect(__acorn.tokTypes.parenR)
+    if (this.eat(__acorn.tokTypes.arrow)) {
+      // (a,)=>a // SequenceExpression makes dummy in the last hole. Drop the dummy.
+      var params = inner.expressions || [inner]
+      if (params.length && isDummy(params[params.length - 1]))
+        params.pop()
+      return this.parseArrowExpression(this.startNodeAt(parenStart), params)
+    }
+    if (this.options.preserveParens) {
+      var par = this.startNodeAt(parenStart)
+      par.expression = inner
+      inner = this.finishNode(par, "ParenthesizedExpression")
+    }
+    return inner
+
+  case __acorn.tokTypes.bracketL:
+    node = this.startNode()
+    node.elements = this.parseExprList(__acorn.tokTypes.bracketR, true)
+    return this.finishNode(node, "ArrayExpression")
+
+  case __acorn.tokTypes.braceL:
+    return this.parseObj()
+
+  case __acorn.tokTypes._class:
+    return this.parseClass(false)
+
+  case __acorn.tokTypes._function:
+    node = this.startNode()
+    this.next()
+    return this.parseFunction(node, false)
+
+  case __acorn.tokTypes._new:
+    return this.parseNew()
+
+  case __acorn.tokTypes.backQuote:
+    return this.parseTemplate()
+
+  default:
+    return this.dummyIdent()
+  }
+}
+
+lp$2.parseNew = function() {
+  var node = this.startNode(), startIndent = this.curIndent, line = this.curLineStart
+  var meta = this.parseIdent(true)
+  if (this.options.ecmaVersion >= 6 && this.eat(__acorn.tokTypes.dot)) {
+    node.meta = meta
+    node.property = this.parseIdent(true)
+    return this.finishNode(node, "MetaProperty")
+  }
+  var start = this.storeCurrentPos()
+  node.callee = this.parseSubscripts(this.parseExprAtom(), start, true, startIndent, line)
+  if (this.tok.type == __acorn.tokTypes.parenL) {
+    node.arguments = this.parseExprList(__acorn.tokTypes.parenR)
+  } else {
+    node.arguments = []
+  }
+  return this.finishNode(node, "NewExpression")
+}
+
+lp$2.parseTemplateElement = function() {
+  var elem = this.startNode()
+  elem.value = {
+    raw: this.input.slice(this.tok.start, this.tok.end).replace(/\r\n?/g, "\n"),
+    cooked: this.tok.value
+  }
+  this.next()
+  elem.tail = this.tok.type === __acorn.tokTypes.backQuote
+  return this.finishNode(elem, "TemplateElement")
+}
+
+lp$2.parseTemplate = function() {
+  var this$1 = this;
+
+  var node = this.startNode()
+  this.next()
+  node.expressions = []
+  var curElt = this.parseTemplateElement()
+  node.quasis = [curElt]
+  while (!curElt.tail) {
+    this$1.next()
+    node.expressions.push(this$1.parseExpression())
+    if (this$1.expect(__acorn.tokTypes.braceR)) {
+      curElt = this$1.parseTemplateElement()
+    } else {
+      curElt = this$1.startNode()
+      curElt.value = {cooked: "", raw: ""}
+      curElt.tail = true
+      this$1.finishNode(curElt, "TemplateElement")
+    }
+    node.quasis.push(curElt)
+  }
+  this.expect(__acorn.tokTypes.backQuote)
+  return this.finishNode(node, "TemplateLiteral")
+}
+
+lp$2.parseObj = function() {
+  var this$1 = this;
+
+  var node = this.startNode()
+  node.properties = []
+  this.pushCx()
+  var indent = this.curIndent + 1, line = this.curLineStart
+  this.eat(__acorn.tokTypes.braceL)
+  if (this.curIndent + 1 < indent) { indent = this.curIndent; line = this.curLineStart }
+  while (!this.closes(__acorn.tokTypes.braceR, indent, line)) {
+    var prop = this$1.startNode(), isGenerator, isAsync, start
+    if (this$1.options.ecmaVersion >= 6) {
+      start = this$1.storeCurrentPos()
+      prop.method = false
+      prop.shorthand = false
+      isGenerator = this$1.eat(__acorn.tokTypes.star)
+    }
+    this$1.parsePropertyName(prop)
+    if (!prop.computed &&
+        prop.key.type === "Identifier" && prop.key.name === "async" && this$1.tok.type !== __acorn.tokTypes.parenL &&
+        this$1.tok.type !== __acorn.tokTypes.colon && !this$1.canInsertSemicolon()) {
+      this$1.parsePropertyName(prop)
+      isAsync = true
+    } else {
+      isAsync = false
+    }
+    if (isDummy(prop.key)) { if (isDummy(this$1.parseMaybeAssign())) this$1.next(); this$1.eat(__acorn.tokTypes.comma); continue }
+    if (this$1.eat(__acorn.tokTypes.colon)) {
+      prop.kind = "init"
+      prop.value = this$1.parseMaybeAssign()
+    } else if (this$1.options.ecmaVersion >= 6 && (this$1.tok.type === __acorn.tokTypes.parenL || this$1.tok.type === __acorn.tokTypes.braceL)) {
+      prop.kind = "init"
+      prop.method = true
+      prop.value = this$1.parseMethod(isGenerator, isAsync)
+    } else if (this$1.options.ecmaVersion >= 5 && prop.key.type === "Identifier" &&
+               !prop.computed && (prop.key.name === "get" || prop.key.name === "set") &&
+               (this$1.tok.type != __acorn.tokTypes.comma && this$1.tok.type != __acorn.tokTypes.braceR)) {
+      prop.kind = prop.key.name
+      this$1.parsePropertyName(prop)
+      prop.value = this$1.parseMethod(false)
+    } else {
+      prop.kind = "init"
+      if (this$1.options.ecmaVersion >= 6) {
+        if (this$1.eat(__acorn.tokTypes.eq)) {
+          var assign = this$1.startNodeAt(start)
+          assign.operator = "="
+          assign.left = prop.key
+          assign.right = this$1.parseMaybeAssign()
+          prop.value = this$1.finishNode(assign, "AssignmentExpression")
+        } else {
+          prop.value = prop.key
+        }
+      } else {
+        prop.value = this$1.dummyIdent()
+      }
+      prop.shorthand = true
+    }
+    node.properties.push(this$1.finishNode(prop, "Property"))
+    this$1.eat(__acorn.tokTypes.comma)
+  }
+  this.popCx()
+  if (!this.eat(__acorn.tokTypes.braceR)) {
+    // If there is no closing brace, make the node span to the start
+    // of the next token (this is useful for Tern)
+    this.last.end = this.tok.start
+    if (this.options.locations) this.last.loc.end = this.tok.loc.start
+  }
+  return this.finishNode(node, "ObjectExpression")
+}
+
+lp$2.parsePropertyName = function(prop) {
+  if (this.options.ecmaVersion >= 6) {
+    if (this.eat(__acorn.tokTypes.bracketL)) {
+      prop.computed = true
+      prop.key = this.parseExpression()
+      this.expect(__acorn.tokTypes.bracketR)
+      return
+    } else {
+      prop.computed = false
+    }
+  }
+  var key = (this.tok.type === __acorn.tokTypes.num || this.tok.type === __acorn.tokTypes.string) ? this.parseExprAtom() : this.parseIdent()
+  prop.key = key || this.dummyIdent()
+}
+
+lp$2.parsePropertyAccessor = function() {
+  if (this.tok.type === __acorn.tokTypes.name || this.tok.type.keyword) return this.parseIdent()
+}
+
+lp$2.parseIdent = function() {
+  var name = this.tok.type === __acorn.tokTypes.name ? this.tok.value : this.tok.type.keyword
+  if (!name) return this.dummyIdent()
+  var node = this.startNode()
+  this.next()
+  node.name = name
+  return this.finishNode(node, "Identifier")
+}
+
+lp$2.initFunction = function(node) {
+  node.id = null
+  node.params = []
+  if (this.options.ecmaVersion >= 6) {
+    node.generator = false
+    node.expression = false
+  }
+  if (this.options.ecmaVersion >= 8)
+    node.async = false
+}
+
+// Convert existing expression atom to assignable pattern
+// if possible.
+
+lp$2.toAssignable = function(node, binding) {
+  var this$1 = this;
+
+  if (!node || node.type == "Identifier" || (node.type == "MemberExpression" && !binding)) {
+    // Okay
+  } else if (node.type == "ParenthesizedExpression") {
+    node.expression = this.toAssignable(node.expression, binding)
+  } else if (this.options.ecmaVersion < 6) {
+    return this.dummyIdent()
+  } else if (node.type == "ObjectExpression") {
+    node.type = "ObjectPattern"
+    var props = node.properties
+    for (var i = 0; i < props.length; i++)
+      props[i].value = this$1.toAssignable(props[i].value, binding)
+  } else if (node.type == "ArrayExpression") {
+    node.type = "ArrayPattern"
+    this.toAssignableList(node.elements, binding)
+  } else if (node.type == "SpreadElement") {
+    node.type = "RestElement"
+    node.argument = this.toAssignable(node.argument, binding)
+  } else if (node.type == "AssignmentExpression") {
+    node.type = "AssignmentPattern"
+    delete node.operator
+  } else {
+    return this.dummyIdent()
+  }
+  return node
+}
+
+lp$2.toAssignableList = function(exprList, binding) {
+  var this$1 = this;
+
+  for (var i = 0; i < exprList.length; i++)
+    exprList[i] = this$1.toAssignable(exprList[i], binding)
+  return exprList
+}
+
+lp$2.parseFunctionParams = function(params) {
+  params = this.parseExprList(__acorn.tokTypes.parenR)
+  return this.toAssignableList(params, true)
+}
+
+lp$2.parseMethod = function(isGenerator, isAsync) {
+  var node = this.startNode(), oldInAsync = this.inAsync
+  this.initFunction(node)
+  if (this.options.ecmaVersion >= 6)
+    node.generator = !!isGenerator
+  if (this.options.ecmaVersion >= 8)
+    node.async = !!isAsync
+  this.inAsync = node.async
+  node.params = this.parseFunctionParams()
+  node.expression = this.options.ecmaVersion >= 6 && this.tok.type !== __acorn.tokTypes.braceL
+  node.body = node.expression ? this.parseMaybeAssign() : this.parseBlock()
+  this.inAsync = oldInAsync
+  return this.finishNode(node, "FunctionExpression")
+}
+
+lp$2.parseArrowExpression = function(node, params, isAsync) {
+  var oldInAsync = this.inAsync
+  this.initFunction(node)
+  if (this.options.ecmaVersion >= 8)
+    node.async = !!isAsync
+  this.inAsync = node.async
+  node.params = this.toAssignableList(params, true)
+  node.expression = this.tok.type !== __acorn.tokTypes.braceL
+  node.body = node.expression ? this.parseMaybeAssign() : this.parseBlock()
+  this.inAsync = oldInAsync
+  return this.finishNode(node, "ArrowFunctionExpression")
+}
+
+lp$2.parseExprList = function(close, allowEmpty) {
+  var this$1 = this;
+
+  this.pushCx()
+  var indent = this.curIndent, line = this.curLineStart, elts = []
+  this.next() // Opening bracket
+  while (!this.closes(close, indent + 1, line)) {
+    if (this$1.eat(__acorn.tokTypes.comma)) {
+      elts.push(allowEmpty ? null : this$1.dummyIdent())
+      continue
+    }
+    var elt = this$1.parseMaybeAssign()
+    if (isDummy(elt)) {
+      if (this$1.closes(close, indent, line)) break
+      this$1.next()
+    } else {
+      elts.push(elt)
+    }
+    this$1.eat(__acorn.tokTypes.comma)
+  }
+  this.popCx()
+  if (!this.eat(close)) {
+    // If there is no closing brace, make the node span to the start
+    // of the next token (this is useful for Tern)
+    this.last.end = this.tok.start
+    if (this.options.locations) this.last.loc.end = this.tok.loc.start
+  }
+  return elts
+}
+
+lp$2.parseAwait = function() {
+  var node = this.startNode()
+  this.next()
+  node.argument = this.parseMaybeUnary()
+  return this.finishNode(node, "AwaitExpression")
+}
+
+// Acorn: Loose parser
+//
+// This module provides an alternative parser (`parse_dammit`) that
+// exposes that same interface as `parse`, but will try to parse
+// anything as JavaScript, repairing syntax error the best it can.
+// There are circumstances in which it will raise an error and give
+// up, but they are very rare. The resulting AST will be a mostly
+// valid JavaScript AST (as per the [Mozilla parser API][api], except
+// that:
+//
+// - Return outside functions is allowed
+//
+// - Label consistency (no conflicts, break only to existing labels)
+//   is not enforced.
+//
+// - Bogus Identifier nodes with a name of `"✖"` are inserted whenever
+//   the parser got too confused to return anything meaningful.
+//
+// [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
+//
+// The expected use for this is to *first* try `acorn.parse`, and only
+// if that fails switch to `parse_dammit`. The loose parser might
+// parse badly indented code incorrectly, so **don't** use it as
+// your default parser.
+//
+// Quite a lot of acorn.js is duplicated here. The alternative was to
+// add a *lot* of extra cruft to that file, making it less readable
+// and slower. Copying and editing the code allowed me to make
+// invasive changes and simplifications without creating a complicated
+// tangle.
+
+__acorn.defaultOptions.tabSize = 4
+
+// eslint-disable-next-line camelcase
+function parse_dammit(input, options) {
+  var p = new LooseParser(input, options)
+  p.next()
+  return p.parseTopLevel()
+}
+
+__acorn.addLooseExports(parse_dammit, LooseParser, pluginsLoose)
+
+exports.parse_dammit = parse_dammit;
+exports.LooseParser = LooseParser;
+exports.pluginsLoose = pluginsLoose;
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
+// clang-format on
diff --git a/third_party/WebKit/Source/devtools/front_end/formatter_worker/module.json b/third_party/WebKit/Source/devtools/front_end/formatter_worker/module.json
index a6eb3fb..c7cc03b0 100644
--- a/third_party/WebKit/Source/devtools/front_end/formatter_worker/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/formatter_worker/module.json
@@ -10,6 +10,7 @@
         "ESTreeWalker.js",
         "FormatterWorker.js",
         "acorn/acorn.js",
+        "acorn/acorn_loose.js",
         "CSSFormatter.js",
         "AcornTokenizer.js",
         "JavaScriptFormatter.js",
@@ -22,6 +23,7 @@
     ],
     "skip_compilation": [
         "acorn/acorn.js",
+        "acorn/acorn_loose.js",
         "../cm_web_modes/css.js",
         "../cm_web_modes/xml.js"
     ]
diff --git a/third_party/WebKit/Source/devtools/front_end/product_registry/module.json b/third_party/WebKit/Source/devtools/front_end/product_registry/module.json
index eb85823..e02f9bd 100644
--- a/third_party/WebKit/Source/devtools/front_end/product_registry/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/product_registry/module.json
@@ -6,6 +6,7 @@
     ],
     "scripts": [
         "ProductNameForURL.js",
-        "ProductRegistryData.js"
+        "ProductRegistryData.js",
+        "sha1/sha1.js"
     ]
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/product_registry/sha1/README.chromium b/third_party/WebKit/Source/devtools/front_end/product_registry/sha1/README.chromium
new file mode 100644
index 0000000..e8b6bf0
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/product_registry/sha1/README.chromium
@@ -0,0 +1,9 @@
+Name: A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1.
+Short Name: sha1.js
+URL: http://pajhome.org.uk/crypt/md5/
+License: BSD
+Security Critical: no
+
+This directory contains Chromium's version of sha1.js which is for hashing strings in javascript synchronously. Added
+jsdoc types to functions, wrapped functions in an outer function and removed portions of code that are not needed by
+Chromium.
\ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/product_registry/sha1/sha1.js b/third_party/WebKit/Source/devtools/front_end/product_registry/sha1/sha1.js
new file mode 100644
index 0000000..5c7133e4
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/product_registry/sha1/sha1.js
@@ -0,0 +1,220 @@
+/*
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
+ * in FIPS 180-1
+ * Version 2.2 Copyright Paul Johnston 2000 - 2009.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for details.
+ */
+// clang-format off
+/* eslint-disable */
+/**
+ * @param {string} str
+ * @return {string}
+ */
+ProductRegistry.sha1 = function(str) {
+  return rstr2hex(rstr_sha1(str2rstr_utf8(str)));
+
+  /**
+   * Calculate the SHA1 of a raw string
+   * @param {string} s
+   * @return {string}
+   */
+  function rstr_sha1(s)
+  {
+    return binb2rstr(binb_sha1(rstr2binb(s), s.length * 8));
+  }
+
+  /**
+   * Convert a raw string to a hex string
+   * @param {string} input
+   * @return {string}
+   */
+  function rstr2hex(input)
+  {
+    var hex_tab = "0123456789abcdef";
+    var output = "";
+    var x;
+    for(var i = 0; i < input.length; i++)
+    {
+      x = input.charCodeAt(i);
+      output += hex_tab.charAt((x >>> 4) & 0x0F)
+             +  hex_tab.charAt( x        & 0x0F);
+    }
+    return output;
+  }
+
+  /**
+   * Encode a string as utf-8.
+   * For efficiency, this assumes the input is valid utf-16.
+   * @param {string} input
+   * @return {string}
+   */
+  function str2rstr_utf8(input)
+  {
+    var output = "";
+    var i = -1;
+    var x, y;
+
+    while(++i < input.length)
+    {
+      /* Decode utf-16 surrogate pairs */
+      x = input.charCodeAt(i);
+      y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
+      if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
+      {
+        x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
+        i++;
+      }
+
+      /* Encode output as utf-8 */
+      if(x <= 0x7F)
+        output += String.fromCharCode(x);
+      else if(x <= 0x7FF)
+        output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
+                                      0x80 | ( x         & 0x3F));
+      else if(x <= 0xFFFF)
+        output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
+                                      0x80 | ((x >>> 6 ) & 0x3F),
+                                      0x80 | ( x         & 0x3F));
+      else if(x <= 0x1FFFFF)
+        output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
+                                      0x80 | ((x >>> 12) & 0x3F),
+                                      0x80 | ((x >>> 6 ) & 0x3F),
+                                      0x80 | ( x         & 0x3F));
+    }
+    return output;
+  }
+
+  /**
+   * Convert a raw string to an array of big-endian words
+   * Characters >255 have their high-byte silently ignored.
+   * @param {string} input
+   * @return {!Array<number>}
+   */
+  function rstr2binb(input)
+  {
+    var output = Array(input.length >> 2);
+    for(var i = 0; i < output.length; i++)
+      output[i] = 0;
+    for(var i = 0; i < input.length * 8; i += 8)
+      output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
+    return output;
+  }
+
+  /**
+   * Convert an array of big-endian words to a string
+   * @param {!Array<number>} input
+   * @return {string}
+   */
+  function binb2rstr(input)
+  {
+    var output = "";
+    for(var i = 0; i < input.length * 32; i += 8)
+      output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF);
+    return output;
+  }
+
+  /**
+   * Calculate the SHA-1 of an array of big-endian words, and a bit length
+   * @param {!Array<number>} x
+   * @param {number} len
+   * @return {!Array<number>}
+   */
+  function binb_sha1(x, len)
+  {
+    /* append padding */
+    x[len >> 5] |= 0x80 << (24 - len % 32);
+    x[((len + 64 >> 9) << 4) + 15] = len;
+
+    var w = Array(80);
+    var a =  1732584193;
+    var b = -271733879;
+    var c = -1732584194;
+    var d =  271733878;
+    var e = -1009589776;
+
+    for(var i = 0; i < x.length; i += 16)
+    {
+      var olda = a;
+      var oldb = b;
+      var oldc = c;
+      var oldd = d;
+      var olde = e;
+
+      for(var j = 0; j < 80; j++)
+      {
+        if(j < 16) w[j] = x[i + j];
+        else w[j] = bit_rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
+        var t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
+                         safe_add(safe_add(e, w[j]), sha1_kt(j)));
+        e = d;
+        d = c;
+        c = bit_rol(b, 30);
+        b = a;
+        a = t;
+      }
+
+      a = safe_add(a, olda);
+      b = safe_add(b, oldb);
+      c = safe_add(c, oldc);
+      d = safe_add(d, oldd);
+      e = safe_add(e, olde);
+    }
+    return Array(a, b, c, d, e);
+
+  }
+
+  /**
+   * Perform the appropriate triplet combination function for the current
+   * iteration
+   * @param {number} t
+   * @param {number} b
+   * @param {number} c
+   * @param {number} d
+   * @return {number}
+   */
+  function sha1_ft(t, b, c, d)
+  {
+    if(t < 20) return (b & c) | ((~b) & d);
+    if(t < 40) return b ^ c ^ d;
+    if(t < 60) return (b & c) | (b & d) | (c & d);
+    return b ^ c ^ d;
+  }
+
+  /**
+   * Determine the appropriate additive constant for the current iteration
+   * @param {number} t
+   * @return {number}
+   */
+  function sha1_kt(t)
+  {
+    return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
+           (t < 60) ? -1894007588 : -899497514;
+  }
+
+  /**
+   * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+   * to work around bugs in some JS interpreters.
+   * @param {number} x
+   * @param {number} y
+   * @return {number}
+   */
+  function safe_add(x, y)
+  {
+    var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+    return (msw << 16) | (lsw & 0xFFFF);
+  }
+
+  /**
+   * Bitwise rotate a 32-bit number to the left.
+   * @param {number} num
+   * @param {number} cnt
+   * @return {number}
+   */
+  function bit_rol(num, cnt)
+  {
+    return (num << cnt) | (num >>> (32 - cnt));
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/GlassPane.js b/third_party/WebKit/Source/devtools/front_end/ui/GlassPane.js
index b07fb35..7d8f5f0 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/GlassPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/GlassPane.js
@@ -201,14 +201,17 @@
           behavior = UI.GlassPane.AnchorBehavior.PreferTop;
 
         var arrowY;
+        var enoughHeight = true;
         if (behavior === UI.GlassPane.AnchorBehavior.PreferTop) {
           positionY = Math.max(gutterSize, anchorBox.y - height - gutterSize);
           var spaceTop = anchorBox.y - positionY - gutterSize;
           if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) {
             if (height < measuredHeight)
               width += scrollbarSize;
-            if (height > spaceTop)
+            if (height > spaceTop) {
               this._arrowElement.classList.add('arrow-none');
+              enoughHeight = false;
+            }
           } else {
             height = Math.min(height, spaceTop);
           }
@@ -224,6 +227,7 @@
             if (height > spaceBottom) {
               this._arrowElement.classList.add('arrow-none');
               positionY = containerHeight - gutterSize - height;
+              enoughHeight = false;
             }
           } else {
             height = Math.min(height, spaceBottom);
@@ -234,7 +238,9 @@
         }
 
         positionX = Math.max(gutterSize, Math.min(anchorBox.x, containerWidth - width - gutterSize));
-        if (this._showArrow && positionX - arrowSize >= gutterSize)
+        if (!enoughHeight)
+          positionX += arrowSize;
+        else if (this._showArrow && positionX - arrowSize >= gutterSize)
           positionX -= arrowSize;
         width = Math.min(width, containerWidth - positionX - gutterSize);
         if (2 * arrowSize >= width) {
@@ -253,14 +259,17 @@
           behavior = UI.GlassPane.AnchorBehavior.PreferLeft;
 
         var arrowX;
+        var enoughWidth = true;
         if (behavior === UI.GlassPane.AnchorBehavior.PreferLeft) {
           positionX = Math.max(gutterSize, anchorBox.x - width - gutterSize);
           var spaceLeft = anchorBox.x - positionX - gutterSize;
           if (this._sizeBehavior === UI.GlassPane.SizeBehavior.MeasureContent) {
             if (width < measuredWidth)
               height += scrollbarSize;
-            if (width > spaceLeft)
+            if (width > spaceLeft) {
               this._arrowElement.classList.add('arrow-none');
+              enoughWidth = false;
+            }
           } else {
             width = Math.min(width, spaceLeft);
           }
@@ -276,6 +285,7 @@
             if (width > spaceRight) {
               this._arrowElement.classList.add('arrow-none');
               positionX = containerWidth - gutterSize - width;
+              enoughWidth = false;
             }
           } else {
             width = Math.min(width, spaceRight);
@@ -286,7 +296,9 @@
         }
 
         positionY = Math.max(gutterSize, Math.min(anchorBox.y, containerHeight - height - gutterSize));
-        if (this._showArrow && positionY - arrowSize >= gutterSize)
+        if (!enoughWidth)
+          positionY += arrowSize;
+        else if (this._showArrow && positionY - arrowSize >= gutterSize)
           positionY -= arrowSize;
         height = Math.min(height, containerHeight - positionY - gutterSize);
         if (2 * arrowSize >= height) {
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/Icon.js b/third_party/WebKit/Source/devtools/front_end/ui/Icon.js
index d4d4b367..509d57a 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/Icon.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/Icon.js
@@ -86,113 +86,114 @@
 
 /** @enum {!UI.Icon.Descriptor} */
 UI.Icon.Descriptors = {
-  'smallicon-error': {x: -20, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-warning': {x: -60, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-info': {x: -80, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-device': {x: -100, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-red-ball': {x: -120, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-green-ball': {x: -140, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-orange-ball': {x: -160, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-green-arrow': {x: -120, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-step-in': {x: -100, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-step-out': {x: 0, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-thick-right-arrow': {x: -180, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-thick-left-arrow': {x: -180, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-user-command': {x: 0, y: -19, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-text-prompt': {x: -20, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-command-result': {x: -40, y: -19, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-shadow': {x: -60, y: -20, width: 10, height: 10, spritesheet: 'smallicons', isMask: true},
-  'smallicon-bezier': {x: -80, y: -20, width: 10, height: 10, spritesheet: 'smallicons', isMask: true},
-  'smallicon-triangle-right': {x: -4, y: -98, width: 10, height: 10, spritesheet: 'largeicons', isMask: true},
-  'smallicon-triangle-down': {x: -20, y: -98, width: 10, height: 10, spritesheet: 'largeicons', isMask: true},
-  'smallicon-triangle-up': {x: -4, y: -111, width: 10, height: 10, spritesheet: 'largeicons', isMask: true},
-  'smallicon-arrow-in-circle': {x: -10, y: -127, width: 11, height: 11, spritesheet: 'largeicons', isMask: true},
-  'smallicon-cross': {x: -177, y: -98, width: 10, height: 10, spritesheet: 'largeicons'},
-  'smallicon-red-cross-hover': {x: -96, y: -96, width: 14, height: 14, spritesheet: 'largeicons'},
-  'smallicon-red-cross-active': {x: -111, y: -96, width: 14, height: 14, spritesheet: 'largeicons'},
-  'smallicon-gray-cross-hover': {x: -143, y: -96, width: 13, height: 13, spritesheet: 'largeicons'},
-  'smallicon-gray-cross-active': {x: -160, y: -96, width: 13, height: 13, spritesheet: 'largeicons'},
+  // small icons
+  'smallicon-bezier': {x: 0, y: 0, width: 10, height: 10, spritesheet: 'smallicons', isMask: true},
+  'smallicon-checkmark': {x: -20, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-command-result': {x: 0, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-cross': {x: -20, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-device': {x: -40, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-error': {x: -40, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-green-arrow': {x: 0, y: -40, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-green-ball': {x: -20, y: -40, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-info': {x: -40, y: -40, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-inline-breakpoint-conditional': {x: -60, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-inline-breakpoint': {x: -60, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-orange-ball': {x: -60, y: -40, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-red-ball': {x: 0, y: -60, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-shadow': {x: -20, y: -60, width: 10, height: 10, spritesheet: 'smallicons', isMask: true},
+  'smallicon-step-in': {x: -40, y: -60, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-step-out': {x: -60, y: -60, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-text-prompt': {x: -80, y: 0, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-thick-left-arrow': {x: -80, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-thick-right-arrow': {x: -80, y: -40, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-triangle-down': {x: -80, y: -60, width: 10, height: 10, spritesheet: 'smallicons', isMask: true},
+  'smallicon-triangle-right': {x: 0, y: -80, width: 10, height: 10, spritesheet: 'smallicons', isMask: true},
+  'smallicon-triangle-up': {x: -20, y: -80, width: 10, height: 10, spritesheet: 'smallicons', isMask: true},
+  'smallicon-user-command': {x: -40, y: -80, width: 10, height: 10, spritesheet: 'smallicons'},
+  'smallicon-warning': {x: -60, y: -80, width: 10, height: 10, spritesheet: 'smallicons'},
 
-  'smallicon-inline-breakpoint': {x: -140, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-inline-breakpoint-conditional': {x: -160, y: -20, width: 10, height: 10, spritesheet: 'smallicons'},
-  'smallicon-file': {x: -64, y: -24, width: 12, height: 14, spritesheet: 'largeicons'},
-  'smallicon-file-sync': {x: -76, y: -24, width: 12, height: 14, spritesheet: 'largeicons'},
-  'smallicon-search': {x: -234, y: -30, width: 12, height: 12, spritesheet: 'largeicons'},
-  'smallicon-checkmark': {x: -128, y: -109, width: 10, height: 10, spritesheet: 'largeicons'},
+  // medium icons
+  'mediumicon-clear-storage': {x: 0, y: 0, width: 16, height: 16, spritesheet: 'mediumicons', isMask: true},
+  'mediumicon-cookie': {x: -16, y: 0, width: 16, height: 16, spritesheet: 'mediumicons', isMask: true},
+  'mediumicon-database': {x: -32, y: 0, width: 16, height: 16, spritesheet: 'mediumicons', isMask: true},
+  'mediumicon-manifest': {x: -48, y: 0, width: 16, height: 16, spritesheet: 'mediumicons', isMask: true},
+  'mediumicon-service-worker': {x: 0, y: -16, width: 16, height: 16, spritesheet: 'mediumicons', isMask: true},
+  'mediumicon-table': {x: -16, y: -16, width: 16, height: 16, spritesheet: 'mediumicons', isMask: true},
+  'smallicon-arrow-in-circle': {x: -34, y: -18, width: 11, height: 11, spritesheet: 'mediumicons', isMask: true},
+  'smallicon-file-sync': {x: -50, y: -17, width: 12, height: 14, spritesheet: 'mediumicons'},
+  'smallicon-file': {x: -2, y: -33, width: 12, height: 14, spritesheet: 'mediumicons'},
+  'smallicon-gray-cross-active': {x: -17, y: -33, width: 13, height: 13, spritesheet: 'mediumicons'},
+  'smallicon-gray-cross-hover': {x: -33, y: -33, width: 13, height: 13, spritesheet: 'mediumicons'},
+  'smallicon-red-cross-active': {x: -49, y: -33, width: 14, height: 14, spritesheet: 'mediumicons'},
+  'smallicon-red-cross-hover': {x: -1, y: -49, width: 14, height: 14, spritesheet: 'mediumicons'},
+  'smallicon-search': {x: -18, y: -50, width: 12, height: 12, spritesheet: 'mediumicons'},
 
-  'largeicon-longclick-triangle': {x: -290, y: -46, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-menu': {x: -192, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-delete': {x: -128, y: -0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-node-search': {x: -320, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-add': {x: -224, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-clear': {x: -64, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-rotate-screen': {x: -192, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-phone': {x: -320, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-layout-editor': {x: 0, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-foreground-color': {x: -128, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-background-color': {x: -96, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-text-shadow': {x: -192, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-box-shadow': {x: -160, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-pause-animation': {x: -320, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-replay-animation': {x: -320, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-play-animation': {x: -320, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-eyedropper': {x: -288, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-copy': {x: -291, y: -143, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-checkmark': {x: -260, y: -71, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-rotate': {x: -160, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-center': {x: -128, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-pan': {x: -98, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-waterfall': {x: -128, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-filter': {x: -32, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-trash-bin': {x: -128, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-pretty-print': {x: -256, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-deactivate-breakpoints': {x: 0, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-activate-breakpoints': {x: -32, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-resume': {x: 0, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-pause': {x: -32, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-pause-on-exceptions': {x: -256, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-play-back': {x: -96, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-play': {x: -64, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-step-over': {x: -128, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-step-out': {x: -96, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-step-in': {x: -64, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-camera': {x: -96, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-stop-recording': {x: -288, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-start-recording': {x: -288, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-large-list': {x: -224, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-visibility': {x: -96, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-refresh': {x: 0, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-dock-to-right': {x: -256, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-dock-to-left': {x: -224, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-dock-to-bottom': {x: -32, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-undock': {x: 0, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-settings-gear': {x: -288, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-
-  'largeicon-show-left-sidebar': {x: -160, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-hide-left-sidebar': {x: -192, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-show-right-sidebar': {x: -192, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-hide-right-sidebar': {x: -192, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-show-top-sidebar': {x: -288, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-hide-top-sidebar': {x: -256, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-show-bottom-sidebar': {x: -224, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-hide-bottom-sidebar': {x: -256, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-navigator-file': {x: -226, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-navigator-file-sync': {x: -162, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'badge-navigator-file-sync': {x: -322, y: -72, width: 28, height: 24, spritesheet: 'largeicons'},
-  'largeicon-navigator-folder': {x: -66, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-navigator-domain': {x: -162, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-navigator-frame': {x: -258, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-navigator-worker': {x: -322, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-navigator-snippet': {x: -226, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-edit': {x: -160, y: -0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-  'largeicon-chevron': {x: -68, y: -143, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
-
-  'mediumicon-manifest': {x: 0, y: -0, width: 16, height: 16, spritesheet: 'resourceicons', isMask: true},
-  'mediumicon-service-worker': {x: -20, y: -0, width: 16, height: 16, spritesheet: 'resourceicons', isMask: true},
-  'mediumicon-clear-storage': {x: -40, y: -0, width: 16, height: 16, spritesheet: 'resourceicons', isMask: true},
-  'mediumicon-database': {x: -60, y: -0, width: 16, height: 16, spritesheet: 'resourceicons', isMask: true},
-  'mediumicon-table': {x: -80, y: -0, width: 16, height: 16, spritesheet: 'resourceicons', isMask: true},
-  'mediumicon-cookie': {x: -120, y: -0, width: 16, height: 16, spritesheet: 'resourceicons', isMask: true},
+  // large icons
+  'badge-navigator-file-sync': {x: 0, y: 0, width: 28, height: 24, spritesheet: 'largeicons'},
+  'largeicon-activate-breakpoints': {x: -28, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-add': {x: 0, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-background-color': {x: -28, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-box-shadow': {x: 0, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-camera': {x: -28, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-center': {x: -56, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-checkmark': {x: -56, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-chevron': {x: -56, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-clear': {x: 0, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-copy': {x: -28, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-deactivate-breakpoints': {x: -56, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-delete': {x: -84, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-dock-to-bottom': {x: -84, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-dock-to-left': {x: -84, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-dock-to-right': {x: -84, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-edit': {x: 0, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-eyedropper': {x: -28, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-filter': {x: -56, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-foreground-color': {x: -84, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-hide-bottom-sidebar': {x: -112, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-hide-left-sidebar': {x: -112, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-hide-right-sidebar': {x: -112, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-hide-top-sidebar': {x: -112, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-large-list': {x: -112, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-layout-editor': {x: 0, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-longclick-triangle': {x: -28, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-menu': {x: -56, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-navigator-domain': {x: -84, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-navigator-file': {x: -112, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-navigator-file-sync': {x: -140, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-navigator-folder': {x: -140, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-navigator-frame': {x: -140, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-navigator-snippet': {x: -140, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-navigator-worker': {x: -140, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-node-search': {x: -140, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-pan': {x: 0, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-pause-animation': {x: -28, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-pause': {x: -56, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-pause-on-exceptions': {x: -84, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-phone': {x: -112, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-play-animation': {x: -140, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-play-back': {x: 0, y: -168, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-play': {x: -28, y: -168, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-pretty-print': {x: -56, y: -168, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-refresh': {x: -84, y: -168, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-replay-animation': {x: -112, y: -168, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-resume': {x: -140, y: -168, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-rotate': {x: -168, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-rotate-screen': {x: -168, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-settings-gear': {x: -168, y: -48, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-show-bottom-sidebar': {x: -168, y: -72, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-show-left-sidebar': {x: -168, y: -96, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-show-right-sidebar': {x: -168, y: -120, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-show-top-sidebar': {x: -168, y: -144, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-start-recording': {x: -168, y: -168, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-step-in': {x: 0, y: -192, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-step-out': {x: -28, y: -192, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-step-over': {x: -56, y: -192, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-stop-recording': {x: -84, y: -192, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-text-shadow': {x: -112, y: -192, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-trash-bin': {x: -140, y: -192, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-undock': {x: -168, y: -192, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-visibility': {x: -196, y: 0, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
+  'largeicon-waterfall': {x: -196, y: -24, width: 28, height: 24, spritesheet: 'largeicons', isMask: true},
 
   'mediumicon-arrow-top': {x: 0, y: 0, width: 19, height: 19, spritesheet: 'arrowicons'},
   'mediumicon-arrow-bottom': {x: 0, y: -19, width: 19, height: 19, spritesheet: 'arrowicons'},
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css b/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css
index 9721b6c..64a7b5d 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css
@@ -339,32 +339,32 @@
 
 .spritesheet-smallicons:not(.icon-mask) {
     background-image: -webkit-image-set(url(Images/smallIcons.png) 1x, url(Images/smallIcons_2x.png) 2x);
-    background-size: 190px 30px;
+    background-size: 90px 90px;
 }
 
 .spritesheet-smallicons.icon-mask {
     -webkit-mask-image: -webkit-image-set(url(Images/smallIcons.png) 1x, url(Images/smallIcons_2x.png) 2x);
-    -webkit-mask-size: 190px 30px;
+    -webkit-mask-size: 90px 90px;
 }
 
 .spritesheet-largeicons:not(.icon-mask) {
-    background-image: -webkit-image-set(url(Images/toolbarButtonGlyphs.png) 1x, url(Images/toolbarButtonGlyphs_2x.png) 2x);
-    background-size: 352px 168px;
+    background-image: -webkit-image-set(url(Images/largeIcons.png) 1x, url(Images/largeIcons_2x.png) 2x);
+    background-size: 224px 216px;
 }
 
 .spritesheet-largeicons.icon-mask {
-    -webkit-mask-image: -webkit-image-set(url(Images/toolbarButtonGlyphs.png) 1x, url(Images/toolbarButtonGlyphs_2x.png) 2x);
-    -webkit-mask-size: 352px 168px;
+    -webkit-mask-image: -webkit-image-set(url(Images/largeIcons.png) 1x, url(Images/largeIcons_2x.png) 2x);
+    -webkit-mask-size: 224px 216px;
 }
 
-.spritesheet-resourceicons:not(.icon-mask) {
-    background-image: -webkit-image-set(url(Images/resourceGlyphs.png) 1x, url(Images/resourceGlyphs_2x.png) 2x);
-    background-size: 140px 20px;
+.spritesheet-mediumicons:not(.icon-mask) {
+    background-image: -webkit-image-set(url(Images/mediumIcons.png) 1x, url(Images/mediumIcons_2x.png) 2x);
+    background-size: 64px 64px;
 }
 
-.spritesheet-resourceicons.icon-mask {
-    -webkit-mask-image: -webkit-image-set(url(Images/resourceGlyphs.png) 1x, url(Images/resourceGlyphs_2x.png) 2x);
-    -webkit-mask-size: 140px 20px;
+.spritesheet-mediumicons.icon-mask {
+    -webkit-mask-image: -webkit-image-set(url(Images/mediumIcons.png) 1x, url(Images/mediumIcons_2x.png) 2x);
+    -webkit-mask-size: 64px 64px;
 }
 
 .spritesheet-arrowicons {
@@ -374,21 +374,21 @@
 
 .force-white-icons [is=ui-icon].spritesheet-smallicons, [is=ui-icon].force-white-icons.spritesheet-smallicons {
     -webkit-mask-image: -webkit-image-set(url(Images/smallIcons.png) 1x, url(Images/smallIcons_2x.png) 2x);
-    -webkit-mask-size: 190px 30px;
+    -webkit-mask-size: 90px 90px;
     -webkit-mask-position: var(--spritesheet-position);
     background: white !important;
 }
 
 .force-white-icons [is=ui-icon].spritesheet-largeicons, [is=ui-icon].force-white-icons.spritesheet-largeicons {
-    -webkit-mask-image: -webkit-image-set(url(Images/toolbarButtonGlyphs.png) 1x, url(Images/toolbarButtonGlyphs_2x.png) 2x);
-    -webkit-mask-size: 352px 168px;
+    -webkit-mask-image: -webkit-image-set(url(Images/largeIcons.png) 1x, url(Images/largeIcons_2x.png) 2x);
+    -webkit-mask-size: 224px 216px;
     -webkit-mask-position: var(--spritesheet-position);
     background: white !important;
 }
 
-.force-white-icons [is=ui-icon].spritesheet-resourceicons, [is=ui-icon].force-white-icons.spritesheet-resourceicons {
-    -webkit-mask-image: -webkit-image-set(url(Images/resourceGlyphs.png) 1x, url(Images/resourceGlyphs_2x.png) 2x);
-    -webkit-mask-size: 140px 20px;
+.force-white-icons [is=ui-icon].spritesheet-mediumicons, [is=ui-icon].force-white-icons.spritesheet-mediumicons {
+    -webkit-mask-image: -webkit-image-set(url(Images/mediumIcons.png) 1x, url(Images/mediumIcons_2x.png) 2x);
+    -webkit-mask-size: 64px 64px;
     -webkit-mask-position: var(--spritesheet-position);
     background: white !important;
 }
diff --git a/third_party/WebKit/Source/modules/BUILD.gn b/third_party/WebKit/Source/modules/BUILD.gn
index 59c50cae..57758b0 100644
--- a/third_party/WebKit/Source/modules/BUILD.gn
+++ b/third_party/WebKit/Source/modules/BUILD.gn
@@ -53,6 +53,10 @@
   visibility = [ "//third_party/WebKit/*" ]
 
   sources = [
+    "EventModules.h",
+    "EventModulesFactory.h",
+    "EventTargetModules.h",
+    "ModulesExport.h",
     "ModulesInitializer.cpp",
     "ModulesInitializer.h",
   ]
diff --git a/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchBridge.cpp b/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchBridge.cpp
index a0b283e..b874f917 100644
--- a/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchBridge.cpp
+++ b/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchBridge.cpp
@@ -52,7 +52,8 @@
     std::unique_ptr<RegistrationCallback> callback) {
   // TODO(peter): Include |requests| in the Mojo call.
   getService()->Fetch(
-      supplementable()->webRegistration()->registrationId(), tag,
+      supplementable()->webRegistration()->registrationId(),
+      getSecurityOrigin(), tag,
       mojom::blink::BackgroundFetchOptions::From(options),
       convertToBaseCallback(
           WTF::bind(&BackgroundFetchBridge::didGetRegistration,
@@ -62,7 +63,8 @@
 void BackgroundFetchBridge::abort(const String& tag,
                                   std::unique_ptr<AbortCallback> callback) {
   getService()->Abort(supplementable()->webRegistration()->registrationId(),
-                      tag, convertToBaseCallback(std::move(callback)));
+                      getSecurityOrigin(), tag,
+                      convertToBaseCallback(std::move(callback)));
 }
 
 void BackgroundFetchBridge::updateUI(
@@ -70,7 +72,7 @@
     const String& title,
     std::unique_ptr<UpdateUICallback> callback) {
   getService()->UpdateUI(supplementable()->webRegistration()->registrationId(),
-                         tag, title,
+                         getSecurityOrigin(), tag, title,
                          convertToBaseCallback(std::move(callback)));
 }
 
@@ -78,7 +80,8 @@
     const String& tag,
     std::unique_ptr<RegistrationCallback> callback) {
   getService()->GetRegistration(
-      supplementable()->webRegistration()->registrationId(), tag,
+      supplementable()->webRegistration()->registrationId(),
+      getSecurityOrigin(), tag,
       convertToBaseCallback(
           WTF::bind(&BackgroundFetchBridge::didGetRegistration,
                     wrapPersistent(this), WTF::passed(std::move(callback)))));
@@ -101,9 +104,14 @@
 
 void BackgroundFetchBridge::getTags(std::unique_ptr<GetTagsCallback> callback) {
   getService()->GetTags(supplementable()->webRegistration()->registrationId(),
+                        getSecurityOrigin(),
                         convertToBaseCallback(std::move(callback)));
 }
 
+SecurityOrigin* BackgroundFetchBridge::getSecurityOrigin() {
+  return supplementable()->getExecutionContext()->getSecurityOrigin();
+}
+
 mojom::blink::BackgroundFetchServicePtr& BackgroundFetchBridge::getService() {
   if (!m_backgroundFetchService) {
     Platform::current()->interfaceProvider()->getInterface(
diff --git a/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchBridge.h b/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchBridge.h
index 4d67561..ebc0202 100644
--- a/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchBridge.h
+++ b/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchBridge.h
@@ -75,6 +75,10 @@
  private:
   explicit BackgroundFetchBridge(ServiceWorkerRegistration&);
 
+  // Returns the security origin for the Service Worker registration this bridge
+  // is servicing, which is to be included in the Mojo calls.
+  SecurityOrigin* getSecurityOrigin();
+
   // Returns an initialized BackgroundFetchServicePtr. A connection will be
   // established after the first call to this method.
   mojom::blink::BackgroundFetchServicePtr& getService();
diff --git a/third_party/WebKit/Source/modules/crypto/BUILD.gn b/third_party/WebKit/Source/modules/crypto/BUILD.gn
index c182558..304d8ce 100644
--- a/third_party/WebKit/Source/modules/crypto/BUILD.gn
+++ b/third_party/WebKit/Source/modules/crypto/BUILD.gn
@@ -6,6 +6,7 @@
 
 blink_modules_sources("crypto") {
   sources = [
+    "AesKeyAlgorithm.h",
     "Crypto.cpp",
     "Crypto.h",
     "CryptoHistograms.cpp",
diff --git a/third_party/WebKit/Source/modules/device_light/BUILD.gn b/third_party/WebKit/Source/modules/device_light/BUILD.gn
index bdbbb56..e8074b6 100644
--- a/third_party/WebKit/Source/modules/device_light/BUILD.gn
+++ b/third_party/WebKit/Source/modules/device_light/BUILD.gn
@@ -6,6 +6,7 @@
 
 blink_modules_sources("device_light") {
   sources = [
+    "DOMWindowDeviceLight.h",
     "DeviceLightController.cpp",
     "DeviceLightController.h",
     "DeviceLightDispatcher.cpp",
diff --git a/third_party/WebKit/Source/modules/device_orientation/BUILD.gn b/third_party/WebKit/Source/modules/device_orientation/BUILD.gn
index 55354d6..f0f24e8b 100644
--- a/third_party/WebKit/Source/modules/device_orientation/BUILD.gn
+++ b/third_party/WebKit/Source/modules/device_orientation/BUILD.gn
@@ -6,6 +6,8 @@
 
 blink_modules_sources("device_orientation") {
   sources = [
+    "DOMWindowDeviceMotion.h",
+    "DOMWindowDeviceOrientation.h",
     "DeviceAcceleration.cpp",
     "DeviceAcceleration.h",
     "DeviceMotionController.cpp",
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.cpp b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.cpp
index d72b0ad..8b421460 100644
--- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.cpp
+++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.cpp
@@ -122,7 +122,7 @@
       init.hasRotationRate()
           ? DeviceMotionData::RotationRate::create(init.rotationRate())
           : nullptr,
-      init.hasInterval() ? init.interval() : 0);
+      init.interval());
 }
 
 DeviceMotionData* DeviceMotionData::create(const device::MotionData& data) {
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.cpp b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.cpp
index e8a83b4..425a817 100644
--- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.cpp
+++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.cpp
@@ -80,8 +80,7 @@
   return m_rotationRate.get();
 }
 
-double DeviceMotionEvent::interval(bool& isNull) const {
-  isNull = false;
+double DeviceMotionEvent::interval() const {
   return m_deviceMotionData->interval();
 }
 
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.h b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.h
index 5103166..68937907 100644
--- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.h
+++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.h
@@ -58,7 +58,7 @@
   DeviceAcceleration* acceleration();
   DeviceAcceleration* accelerationIncludingGravity();
   DeviceRotationRate* rotationRate();
-  double interval(bool& isNull) const;
+  double interval() const;
 
   const AtomicString& interfaceName() const override;
 
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.idl b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.idl
index 5477afd6..e105520 100644
--- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.idl
+++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.idl
@@ -30,5 +30,5 @@
     readonly attribute DeviceAcceleration? acceleration;
     readonly attribute DeviceAcceleration? accelerationIncludingGravity;
     readonly attribute DeviceRotationRate? rotationRate;
-    readonly attribute double? interval;
+    readonly attribute double interval;
 };
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEventInit.idl b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEventInit.idl
index 4f8663c..36411c93 100644
--- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEventInit.idl
+++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEventInit.idl
@@ -8,5 +8,5 @@
   DeviceAccelerationInit? acceleration;
   DeviceAccelerationInit? accelerationIncludingGravity;
   DeviceRotationRateInit? rotationRate;
-  double? interval = null;
+  double interval = 0;
 };
diff --git a/third_party/WebKit/Source/modules/geolocation/BUILD.gn b/third_party/WebKit/Source/modules/geolocation/BUILD.gn
index f43d690..79e020f 100644
--- a/third_party/WebKit/Source/modules/geolocation/BUILD.gn
+++ b/third_party/WebKit/Source/modules/geolocation/BUILD.gn
@@ -10,10 +10,15 @@
     "GeoNotifier.cpp",
     "GeoNotifier.h",
     "Geolocation.cpp",
+    "GeolocationError.h",
     "GeolocationWatchers.cpp",
     "GeolocationWatchers.h",
+    "Geoposition.h",
     "NavigatorGeolocation.cpp",
     "NavigatorGeolocation.h",
+    "PositionCallback.h",
+    "PositionError.h",
+    "PositionErrorCallback.h",
   ]
   deps = [
     "//device/geolocation/public/interfaces:interfaces_blink",
diff --git a/third_party/WebKit/Source/modules/mediastream/BUILD.gn b/third_party/WebKit/Source/modules/mediastream/BUILD.gn
index a33f22d..b0474f3 100644
--- a/third_party/WebKit/Source/modules/mediastream/BUILD.gn
+++ b/third_party/WebKit/Source/modules/mediastream/BUILD.gn
@@ -6,6 +6,7 @@
 
 blink_modules_sources("mediastream") {
   sources = [
+    "DOMWindowMediaStream.h",
     "MediaConstraintsImpl.cpp",
     "MediaConstraintsImpl.h",
     "MediaDeviceInfo.cpp",
diff --git a/third_party/WebKit/Source/modules/nfc/BUILD.gn b/third_party/WebKit/Source/modules/nfc/BUILD.gn
index 8d9f3f7d..b1e4ee6 100644
--- a/third_party/WebKit/Source/modules/nfc/BUILD.gn
+++ b/third_party/WebKit/Source/modules/nfc/BUILD.gn
@@ -6,6 +6,7 @@
 
 blink_modules_sources("nfc") {
   sources = [
+    "MessageCallback.h",
     "NFC.cpp",
     "NFC.h",
     "NFCError.cpp",
diff --git a/third_party/WebKit/Source/modules/peerconnection/BUILD.gn b/third_party/WebKit/Source/modules/peerconnection/BUILD.gn
index 2eac470..229f7d3 100644
--- a/third_party/WebKit/Source/modules/peerconnection/BUILD.gn
+++ b/third_party/WebKit/Source/modules/peerconnection/BUILD.gn
@@ -32,6 +32,7 @@
     "RTCSessionDescriptionRequestImpl.h",
     "RTCSessionDescriptionRequestPromiseImpl.cpp",
     "RTCSessionDescriptionRequestPromiseImpl.h",
+    "RTCStatsCallback.h",
     "RTCStatsReport.cpp",
     "RTCStatsReport.h",
     "RTCStatsRequestImpl.cpp",
diff --git a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
index 6e9abeb..927d8ef 100644
--- a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
@@ -5,7 +5,7 @@
 #include "modules/shapedetection/BarcodeDetector.h"
 
 #include "core/dom/DOMException.h"
-#include "core/dom/DOMRect.h"
+#include "core/geometry/DOMRect.h"
 #include "core/html/canvas/CanvasImageSource.h"
 #include "modules/imagecapture/Point2D.h"
 #include "modules/shapedetection/DetectedBarcode.h"
diff --git a/third_party/WebKit/Source/modules/shapedetection/DetectedBarcode.cpp b/third_party/WebKit/Source/modules/shapedetection/DetectedBarcode.cpp
index c5aeab8..d22edd99 100644
--- a/third_party/WebKit/Source/modules/shapedetection/DetectedBarcode.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/DetectedBarcode.cpp
@@ -4,7 +4,7 @@
 
 #include "modules/shapedetection/DetectedBarcode.h"
 
-#include "core/dom/DOMRect.h"
+#include "core/geometry/DOMRect.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/shapedetection/DetectedFace.cpp b/third_party/WebKit/Source/modules/shapedetection/DetectedFace.cpp
index a2fa886..3bc5779 100644
--- a/third_party/WebKit/Source/modules/shapedetection/DetectedFace.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/DetectedFace.cpp
@@ -4,7 +4,7 @@
 
 #include "modules/shapedetection/DetectedFace.h"
 
-#include "core/dom/DOMRect.h"
+#include "core/geometry/DOMRect.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/shapedetection/DetectedText.cpp b/third_party/WebKit/Source/modules/shapedetection/DetectedText.cpp
index 4650ef9e3..a679fb1 100644
--- a/third_party/WebKit/Source/modules/shapedetection/DetectedText.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/DetectedText.cpp
@@ -4,7 +4,7 @@
 
 #include "modules/shapedetection/DetectedText.h"
 
-#include "core/dom/DOMRect.h"
+#include "core/geometry/DOMRect.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
index ca0b77b8..e2c1f90 100644
--- a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
@@ -5,7 +5,7 @@
 #include "modules/shapedetection/FaceDetector.h"
 
 #include "core/dom/DOMException.h"
-#include "core/dom/DOMRect.h"
+#include "core/geometry/DOMRect.h"
 #include "core/html/canvas/CanvasImageSource.h"
 #include "modules/shapedetection/DetectedFace.h"
 #include "modules/shapedetection/FaceDetectorOptions.h"
diff --git a/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.cpp
index cd0d397..373be36 100644
--- a/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.cpp
@@ -5,10 +5,10 @@
 #include "modules/shapedetection/ShapeDetector.h"
 
 #include "core/dom/DOMException.h"
-#include "core/dom/DOMRect.h"
 #include "core/dom/Document.h"
 #include "core/frame/ImageBitmap.h"
 #include "core/frame/LocalFrame.h"
+#include "core/geometry/DOMRect.h"
 #include "core/html/HTMLImageElement.h"
 #include "core/html/HTMLVideoElement.h"
 #include "core/html/ImageData.h"
diff --git a/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
index 5b84557..3cab8b2 100644
--- a/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
@@ -5,7 +5,7 @@
 #include "modules/shapedetection/TextDetector.h"
 
 #include "core/dom/DOMException.h"
-#include "core/dom/DOMRect.h"
+#include "core/geometry/DOMRect.h"
 #include "core/html/canvas/CanvasImageSource.h"
 #include "modules/shapedetection/DetectedText.h"
 #include "public/platform/InterfaceProvider.h"
diff --git a/third_party/WebKit/Source/modules/speech/BUILD.gn b/third_party/WebKit/Source/modules/speech/BUILD.gn
index 5b7b006..0e60ce45 100644
--- a/third_party/WebKit/Source/modules/speech/BUILD.gn
+++ b/third_party/WebKit/Source/modules/speech/BUILD.gn
@@ -6,6 +6,7 @@
 
 blink_modules_sources("speech") {
   sources = [
+    "DOMWindowSpeech.h",
     "DOMWindowSpeechSynthesis.cpp",
     "DOMWindowSpeechSynthesis.h",
     "SpeechGrammar.cpp",
diff --git a/third_party/WebKit/Source/modules/storage/BUILD.gn b/third_party/WebKit/Source/modules/storage/BUILD.gn
index e25818f..37006cc8 100644
--- a/third_party/WebKit/Source/modules/storage/BUILD.gn
+++ b/third_party/WebKit/Source/modules/storage/BUILD.gn
@@ -16,6 +16,7 @@
     "Storage.h",
     "StorageArea.cpp",
     "StorageArea.h",
+    "StorageClient.h",
     "StorageEvent.cpp",
     "StorageEvent.h",
     "StorageNamespace.cpp",
diff --git a/third_party/WebKit/Source/modules/webdatabase/BUILD.gn b/third_party/WebKit/Source/modules/webdatabase/BUILD.gn
index 073a3b6..e5c9e51c 100644
--- a/third_party/WebKit/Source/modules/webdatabase/BUILD.gn
+++ b/third_party/WebKit/Source/modules/webdatabase/BUILD.gn
@@ -46,14 +46,18 @@
     "SQLStatement.h",
     "SQLStatementBackend.cpp",
     "SQLStatementBackend.h",
+    "SQLStatementCallback.h",
+    "SQLStatementErrorCallback.h",
     "SQLTransaction.cpp",
     "SQLTransaction.h",
     "SQLTransactionBackend.cpp",
     "SQLTransactionBackend.h",
+    "SQLTransactionCallback.h",
     "SQLTransactionClient.cpp",
     "SQLTransactionClient.h",
     "SQLTransactionCoordinator.cpp",
     "SQLTransactionCoordinator.h",
+    "SQLTransactionErrorCallback.h",
     "SQLTransactionState.h",
     "SQLTransactionStateMachine.cpp",
     "SQLTransactionStateMachine.h",
diff --git a/third_party/WebKit/Source/modules/webdatabase/OWNERS b/third_party/WebKit/Source/modules/webdatabase/OWNERS
index 3723f40..a85c576 100644
--- a/third_party/WebKit/Source/modules/webdatabase/OWNERS
+++ b/third_party/WebKit/Source/modules/webdatabase/OWNERS
@@ -1 +1,4 @@
 michaeln@chromium.org
+
+# TEAM: storage-dev@chromium.org
+# COMPONENT: Blink>Storage
diff --git a/third_party/WebKit/Source/modules/webgl/BUILD.gn b/third_party/WebKit/Source/modules/webgl/BUILD.gn
index 2ac342ef..4c7b770 100644
--- a/third_party/WebKit/Source/modules/webgl/BUILD.gn
+++ b/third_party/WebKit/Source/modules/webgl/BUILD.gn
@@ -24,6 +24,7 @@
     "EXTTextureFilterAnisotropic.h",
     "EXTsRGB.cpp",
     "EXTsRGB.h",
+    "GLStringQuery.h",
     "OESElementIndexUint.cpp",
     "OESElementIndexUint.h",
     "OESStandardDerivatives.cpp",
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn
index 051dead..86c87bc 100644
--- a/third_party/WebKit/Source/platform/BUILD.gn
+++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -222,6 +222,7 @@
 
   sources = [
     "AsyncFileSystemCallbacks.h",
+    "AsyncMethodRunner.h",
     "CalculationValue.h",
     "ContentDecryptionModuleResult.h",
     "ContentSettingCallbacks.cpp",
@@ -230,8 +231,10 @@
     "ContextMenu.h",
     "ContextMenuItem.cpp",
     "ContextMenuItem.h",
+    "CrossOriginAttributeValue.h",
     "CrossThreadCopier.cpp",
     "CrossThreadCopier.h",
+    "CrossThreadFunctional.h",
     "Crypto.cpp",
     "Crypto.h",
     "CryptoResult.h",
@@ -290,6 +293,7 @@
     "PartitionAllocMemoryDumpProvider.cpp",
     "PartitionAllocMemoryDumpProvider.h",
     "PasteMode.h",
+    "PlatformExport.h",
     "PlatformResourceLoader.cpp",
     "PlatformResourceLoader.h",
     "PluginScriptForbiddenScope.cpp",
@@ -585,6 +589,7 @@
     "fonts/AlternateFontFamily.h",
     "fonts/CharacterRange.h",
     "fonts/CustomFontData.h",
+    "fonts/FallbackListCompositeKey.h",
     "fonts/Font.cpp",
     "fonts/Font.h",
     "fonts/FontBaseline.h",
@@ -612,9 +617,14 @@
     "fonts/FontFallbackPriority.h",
     "fonts/FontFamily.cpp",
     "fonts/FontFamily.h",
+    "fonts/FontMetrics.h",
+    "fonts/FontOrientation.h",
     "fonts/FontPlatformData.cpp",
     "fonts/FontPlatformData.h",
+    "fonts/FontSmoothingMode.h",
+    "fonts/FontTraits.h",
     "fonts/FontVariantNumeric.h",
+    "fonts/FontWidthVariant.h",
     "fonts/GenericFontFamilySettings.cpp",
     "fonts/GenericFontFamilySettings.h",
     "fonts/GlyphMetricsMap.h",
@@ -630,6 +640,8 @@
     "fonts/SmallCapsIterator.h",
     "fonts/SymbolsIterator.cpp",
     "fonts/SymbolsIterator.h",
+    "fonts/TextRenderingMode.h",
+    "fonts/TypesettingFeatures.h",
     "fonts/UTF16TextIterator.cpp",
     "fonts/UTF16TextIterator.h",
     "fonts/UnicodeRangeSet.cpp",
@@ -770,10 +782,12 @@
     "graphics/CompositorElementId.h",
     "graphics/CompositorFilterOperations.cpp",
     "graphics/CompositorFilterOperations.h",
+    "graphics/CompositorMutableProperties.h",
     "graphics/CompositorMutableState.cpp",
     "graphics/CompositorMutableState.h",
     "graphics/CompositorMutableStateProvider.cpp",
     "graphics/CompositorMutableStateProvider.h",
+    "graphics/CompositorMutation.h",
     "graphics/CompositorMutationsTarget.h",
     "graphics/CompositorMutator.h",
     "graphics/CompositorMutatorClient.cpp",
@@ -784,6 +798,7 @@
     "graphics/ContiguousContainer.h",
     "graphics/CrossfadeGeneratedImage.cpp",
     "graphics/CrossfadeGeneratedImage.h",
+    "graphics/DashArray.h",
     "graphics/DecodingImageGenerator.cpp",
     "graphics/DecodingImageGenerator.h",
     "graphics/DeferredImageDecoder.cpp",
@@ -1586,8 +1601,10 @@
   testonly = true
 
   sources = [
+    "graphics/gpu/DrawingBufferTestHelpers.h",
     "network/mime/MockMimeRegistry.h",
     "scheduler/base/task_queue_manager_delegate_for_test.cc",
+    "scheduler/base/test_task_time_observer.h",
     "scheduler/base/test_time_source.cc",
     "scheduler/base/test_time_source.h",
     "scheduler/child/scheduler_tqm_delegate_for_test.cc",
diff --git a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
index 739f7a1..4e6e71e 100644
--- a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
+++ b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
@@ -224,7 +224,6 @@
   const int renderPassId = 1;
   std::unique_ptr<cc::RenderPass> pass = cc::RenderPass::Create();
   pass->SetNew(renderPassId, bounds, bounds, gfx::Transform());
-  pass->has_transparent_background = false;
 
   cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
   sqs->SetAll(gfx::Transform(), bounds.size(), bounds, bounds, false, 1.f,
@@ -281,7 +280,10 @@
       pass->CreateAndAppendDrawQuad<cc::TextureDrawQuad>();
   gfx::Size rectSize(m_width, m_height);
 
+  // TODO(crbug.com/705019): optimize for contexts that have {alpha: false}
   const bool needsBlending = true;
+  gfx::Rect opaqueRect(0, 0);
+
   // TOOD(crbug.com/645993): this should be inherited from WebGL context's
   // creation settings.
   const bool premultipliedAlpha = true;
@@ -293,7 +295,7 @@
   // TODO(crbug.com/645590): filter should respect the image-rendering CSS
   // property of associated canvas element.
   const bool nearestNeighbor = false;
-  quad->SetAll(sqs, bounds, bounds, bounds, needsBlending, resource.id,
+  quad->SetAll(sqs, bounds, opaqueRect, bounds, needsBlending, resource.id,
                gfx::Size(), premultipliedAlpha, uvTopLeft, uvBottomRight,
                SK_ColorTRANSPARENT, vertexOpacity, yflipped, nearestNeighbor,
                false);
diff --git a/third_party/WebKit/Source/platform/heap/BUILD.gn b/third_party/WebKit/Source/platform/heap/BUILD.gn
index e5398a18..b19e503 100644
--- a/third_party/WebKit/Source/platform/heap/BUILD.gn
+++ b/third_party/WebKit/Source/platform/heap/BUILD.gn
@@ -26,8 +26,11 @@
     "HeapAllocator.h",
     "HeapCompact.cpp",
     "HeapCompact.h",
+    "HeapLinkedStack.h",
     "HeapPage.cpp",
     "HeapPage.h",
+    "HeapTerminatedArray.h",
+    "HeapTerminatedArrayBuilder.h",
     "Member.h",
     "PageMemory.cpp",
     "PageMemory.h",
diff --git a/third_party/WebKit/Source/platform/heap/ThreadState.h b/third_party/WebKit/Source/platform/heap/ThreadState.h
index 4807cfd..c4002b3 100644
--- a/third_party/WebKit/Source/platform/heap/ThreadState.h
+++ b/third_party/WebKit/Source/platform/heap/ThreadState.h
@@ -253,7 +253,7 @@
   }
   void enterGCForbiddenScope() { m_gcForbiddenCount++; }
   void leaveGCForbiddenScope() {
-    DCHECK_GE(m_gcForbiddenCount, 0u);
+    DCHECK_GT(m_gcForbiddenCount, 0u);
     m_gcForbiddenCount--;
   }
   bool isMixinInConstruction() const { return m_mixinsBeingConstructedCount; }
diff --git a/third_party/WebKit/Source/platform/loader/BUILD.gn b/third_party/WebKit/Source/platform/loader/BUILD.gn
index 2ce1c3b..9f5ac24e 100644
--- a/third_party/WebKit/Source/platform/loader/BUILD.gn
+++ b/third_party/WebKit/Source/platform/loader/BUILD.gn
@@ -58,6 +58,7 @@
     "fetch/ResourceLoader.h",
     "fetch/ResourceLoaderOptions.h",
     "fetch/ResourceLoadingLog.h",
+    "fetch/ResourceOwner.h",
     "fetch/ResourceRequest.cpp",
     "fetch/ResourceRequest.h",
     "fetch/ResourceResponse.cpp",
diff --git a/third_party/WebKit/Source/web/ValidationMessageClientImpl.cpp b/third_party/WebKit/Source/web/ValidationMessageClientImpl.cpp
index 294af07..c740f751 100644
--- a/third_party/WebKit/Source/web/ValidationMessageClientImpl.cpp
+++ b/third_party/WebKit/Source/web/ValidationMessageClientImpl.cpp
@@ -111,11 +111,16 @@
   return m_currentAnchor == &anchor;
 }
 
-void ValidationMessageClientImpl::documentDetached(const Document& document) {
+void ValidationMessageClientImpl::willUnloadDocument(const Document& document) {
   if (m_currentAnchor && m_currentAnchor->document() == document)
     hideValidationMessage(*m_currentAnchor);
 }
 
+void ValidationMessageClientImpl::documentDetached(const Document& document) {
+  DCHECK(!m_currentAnchor || m_currentAnchor->document() != document)
+      << "willUnloadDocument() should be called beforehand.";
+}
+
 void ValidationMessageClientImpl::checkAnchorStatus(TimerBase*) {
   DCHECK(m_currentAnchor);
   if (monotonicallyIncreasingTime() >= m_finishTime || !currentView()) {
diff --git a/third_party/WebKit/Source/web/ValidationMessageClientImpl.h b/third_party/WebKit/Source/web/ValidationMessageClientImpl.h
index dc308d3..57a1519 100644
--- a/third_party/WebKit/Source/web/ValidationMessageClientImpl.h
+++ b/third_party/WebKit/Source/web/ValidationMessageClientImpl.h
@@ -60,6 +60,7 @@
                              TextDirection subMessageDir) override;
   void hideValidationMessage(const Element& anchor) override;
   bool isValidationMessageVisible(const Element& anchor) override;
+  void willUnloadDocument(const Document&) override;
   void documentDetached(const Document&) override;
   void willBeDestroyed() override;
 
diff --git a/third_party/WebKit/Source/web/WebPagePopupImpl.cpp b/third_party/WebKit/Source/web/WebPagePopupImpl.cpp
index defe1a1..a91ea23 100644
--- a/third_party/WebKit/Source/web/WebPagePopupImpl.cpp
+++ b/third_party/WebKit/Source/web/WebPagePopupImpl.cpp
@@ -303,6 +303,10 @@
       mainSettings.getAccessibilityEnabled());
   m_page->settings().setScrollAnimatorEnabled(
       mainSettings.getScrollAnimatorEnabled());
+  m_page->settings().setAvailablePointerTypes(
+      mainSettings.getAvailablePointerTypes());
+  m_page->settings().setPrimaryPointerType(
+      mainSettings.getPrimaryPointerType());
 
   provideContextFeaturesTo(*m_page, WTF::makeUnique<PagePopupFeaturesClient>());
   DEFINE_STATIC_LOCAL(LocalFrameClient, emptyLocalFrameClient,
diff --git a/third_party/WebKit/Source/web/resources/calendarPicker.js b/third_party/WebKit/Source/web/resources/calendarPicker.js
index c65886c..250b55c 100644
--- a/third_party/WebKit/Source/web/resources/calendarPicker.js
+++ b/third_party/WebKit/Source/web/resources/calendarPicker.js
@@ -60,7 +60,7 @@
  * @return {!boolean}
  */
 function hasInaccuratePointingDevice() {
-  return matchMedia('(pointer: coarse)').matches;
+  return matchMedia('(any-pointer: coarse)').matches;
 }
 
 /**
diff --git a/third_party/WebKit/Source/web/tests/RootScrollerTest.cpp b/third_party/WebKit/Source/web/tests/RootScrollerTest.cpp
index 09c5493..0ce5504bb 100644
--- a/third_party/WebKit/Source/web/tests/RootScrollerTest.cpp
+++ b/third_party/WebKit/Source/web/tests/RootScrollerTest.cpp
@@ -730,127 +730,6 @@
   m_helper.reset();
 }
 
-// Tests that the clipping layer is resized on the root scroller element even
-// if the layout height doesn't change.
-TEST_F(RootScrollerTest, BrowserControlsResizeClippingLayer) {
-  bool oldInertTopControls = RuntimeEnabledFeatures::inertTopControlsEnabled();
-  RuntimeEnabledFeatures::setInertTopControlsEnabled(true);
-
-  initialize("root-scroller.html");
-  Element* container = mainFrame()->document()->getElementById("container");
-
-  {
-    mainFrame()->document()->setRootScroller(container);
-
-    mainFrameView()->updateAllLifecyclePhases();
-    ASSERT_EQ(toLayoutBox(container->layoutObject())->clientHeight(), 400);
-
-    GraphicsLayer* clipLayer = toLayoutBox(container->layoutObject())
-                                   ->layer()
-                                   ->compositedLayerMapping()
-                                   ->scrollingLayer();
-    ASSERT_EQ(clipLayer->size().height(), 400);
-  }
-
-  {
-    webViewImpl()->handleInputEvent(
-        generateTouchGestureEvent(WebInputEvent::GestureScrollBegin));
-
-    // Scrolling over the #container DIV should cause the browser controls to
-    // hide.
-    EXPECT_FLOAT_EQ(1, browserControls().shownRatio());
-    webViewImpl()->handleInputEvent(generateTouchGestureEvent(
-        WebInputEvent::GestureScrollUpdate, 0, -browserControls().height()));
-    EXPECT_FLOAT_EQ(0, browserControls().shownRatio());
-
-    webViewImpl()->handleInputEvent(
-        generateTouchGestureEvent(WebInputEvent::GestureScrollEnd));
-
-    webViewImpl()->resizeWithBrowserControls(IntSize(400, 450), 50, false);
-
-    EXPECT_FALSE(container->layoutObject()->needsLayout());
-
-    mainFrameView()->updateAllLifecyclePhases();
-
-    // Since inert top controls are enabled, the container should not have
-    // resized, however, the clip layer should.
-    EXPECT_EQ(toLayoutBox(container->layoutObject())->clientHeight(), 400);
-    GraphicsLayer* clipLayer = toLayoutBox(container->layoutObject())
-                                   ->layer()
-                                   ->compositedLayerMapping()
-                                   ->scrollingLayer();
-    EXPECT_EQ(clipLayer->size().height(), 450);
-  }
-
-  RuntimeEnabledFeatures::setInertTopControlsEnabled(oldInertTopControls);
-}
-
-// Tests that the clipping layer is resized on the root scroller element when
-// it's an iframe and even if the layout height doesn't change.
-TEST_F(RootScrollerTest, BrowserControlsResizeClippingLayerIFrame) {
-  bool oldInertTopControls = RuntimeEnabledFeatures::inertTopControlsEnabled();
-  RuntimeEnabledFeatures::setInertTopControlsEnabled(true);
-
-  initialize("root-scroller-iframe.html");
-
-  Element* iframe = mainFrame()->document()->getElementById("iframe");
-  LocalFrame* childFrame =
-      toLocalFrame(toHTMLFrameOwnerElement(iframe)->contentFrame());
-
-  PaintLayerCompositor* childPLC =
-      childFrame->view()->layoutViewItem().compositor();
-
-  // Give the iframe itself scrollable content and make it the root scroller.
-  {
-    NonThrowableExceptionState nonThrow;
-    mainFrame()->document()->setRootScroller(iframe, nonThrow);
-
-    WebLocalFrame* childWebFrame =
-        mainWebFrame()->firstChild()->toWebLocalFrame();
-    executeScript(
-        "document.getElementById('container').style.width = '300%';"
-        "document.getElementById('container').style.height = '300%';",
-        *childWebFrame);
-
-    mainFrameView()->updateAllLifecyclePhases();
-
-    // Some sanity checks to make sure the test is setup correctly.
-    ASSERT_EQ(childFrame->view()->visibleContentSize().height(), 400);
-    ASSERT_EQ(childPLC->containerLayer()->size().height(), 400);
-    ASSERT_EQ(childPLC->rootGraphicsLayer()->size().height(), 400);
-  }
-
-  {
-    webViewImpl()->handleInputEvent(
-        generateTouchGestureEvent(WebInputEvent::GestureScrollBegin));
-
-    // Scrolling over the #container DIV should cause the browser controls to
-    // hide.
-    EXPECT_FLOAT_EQ(1, browserControls().shownRatio());
-    webViewImpl()->handleInputEvent(generateTouchGestureEvent(
-        WebInputEvent::GestureScrollUpdate, 0, -browserControls().height()));
-    EXPECT_FLOAT_EQ(0, browserControls().shownRatio());
-
-    webViewImpl()->handleInputEvent(
-        generateTouchGestureEvent(WebInputEvent::GestureScrollEnd));
-
-    webViewImpl()->resizeWithBrowserControls(IntSize(400, 450), 50, false);
-
-    EXPECT_FALSE(childFrame->view()->needsLayout());
-
-    mainFrameView()->updateAllLifecyclePhases();
-
-    // Since inert top controls are enabled, the iframe element should not have
-    // resized, however, its clip layer should resize to reveal content as the
-    // browser controls hide.
-    EXPECT_EQ(childFrame->view()->visibleContentSize().height(), 400);
-    EXPECT_EQ(childPLC->containerLayer()->size().height(), 450);
-    EXPECT_EQ(childPLC->rootGraphicsLayer()->size().height(), 450);
-  }
-
-  RuntimeEnabledFeatures::setInertTopControlsEnabled(oldInertTopControls);
-}
-
 // Tests that removing the root scroller element from the DOM resets the
 // effective root scroller without waiting for any lifecycle events.
 TEST_F(RootScrollerTest, RemoveRootScrollerFromDom) {
diff --git a/third_party/WebKit/Source/wtf/BUILD.gn b/third_party/WebKit/Source/wtf/BUILD.gn
index 4370bec..634b9d8 100644
--- a/third_party/WebKit/Source/wtf/BUILD.gn
+++ b/third_party/WebKit/Source/wtf/BUILD.gn
@@ -40,8 +40,8 @@
     "DataLog.h",
     "DateMath.h",
     "Deque.h",
-    "Dummy.cpp",
     "DoublyLinkedList.h",
+    "Dummy.cpp",
     "DynamicAnnotations.h",
     "FilePrintStream.h",
     "Forward.h",
@@ -70,6 +70,7 @@
     "PtrUtil.h",
     "RefCounted.h",
     "RefPtr.h",
+    "RefVector.h",
     "RetainPtr.h",
     "SaturatedArithmetic.h",
     "SizeAssertions.h",
@@ -79,6 +80,8 @@
     "StdLibExtras.h",
     "StringExtras.h",
     "StringHasher.h",
+    "TerminatedArray.h",
+    "TerminatedArrayBuilder.h",
     "ThreadRestrictionVerifier.h",
     "ThreadSafeRefCounted.h",
     "ThreadSpecific.h",
@@ -157,6 +160,7 @@
     "typed_arrays/Uint16Array.h",
     "typed_arrays/Uint32Array.h",
     "typed_arrays/Uint8Array.h",
+    "typed_arrays/Uint8ClampedArray.h",
   ]
 
   configs += [
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/auto_rebaseline_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/auto_rebaseline_unittest.py
index a70786da..d97cae3 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/auto_rebaseline_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/auto_rebaseline_unittest.py
@@ -228,22 +228,46 @@
 
         self.assertEqual(self.tool.executive.calls, [
             [
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'png',
-                 '--builder', 'MOCK Mac10.11', '--test', 'fast/dom/prototype-strawberry.html'],
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.11', '--test', 'fast/dom/prototype-taco.html'],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'fast/dom/prototype-strawberry.html',
+                    '--suffixes', 'png',
+                    '--port-name', 'test-mac-mac10.11',
+                ],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'fast/dom/prototype-taco.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.11',
+                ],
             ],
             [
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'png',
-                 '--builder', 'MOCK Mac10.11', '--test', 'fast/dom/prototype-strawberry.html'],
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.11', '--test', 'fast/dom/prototype-taco.html'],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'fast/dom/prototype-strawberry.html',
+                    '--suffixes', 'png',
+                    '--port-name', 'test-mac-mac10.11',
+                    '--builder', 'MOCK Mac10.11',
+                ],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'fast/dom/prototype-taco.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.11',
+                    '--builder', 'MOCK Mac10.11',
+                ],
             ],
             [
-                ['python', 'echo', 'optimize-baselines',
-                 '--suffixes', 'png', 'fast/dom/prototype-strawberry.html'],
-                ['python', 'echo', 'optimize-baselines',
-                 '--suffixes', 'txt', 'fast/dom/prototype-taco.html'],
+                [
+                    'python', 'echo', 'optimize-baselines',
+                    '--suffixes', 'png',
+                    'fast/dom/prototype-strawberry.html',
+                ],
+                [
+                    'python', 'echo', 'optimize-baselines',
+                    '--suffixes', 'txt',
+                    'fast/dom/prototype-taco.html',
+                ],
             ],
             ['git', 'cl', 'upload', '-f'],
             ['git', 'pull'],
@@ -302,11 +326,24 @@
         self._execute_with_mock_options()
 
         self.assertEqual(self.tool.executive.calls, [
-            [['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt',
-              '--builder', 'MOCK Mac10.11', '--test', 'fast/dom/prototype-taco.html']],
-            [['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt',
-              '--builder', 'MOCK Mac10.11', '--test', 'fast/dom/prototype-taco.html']],
-            [['python', 'echo', 'optimize-baselines', '--suffixes', 'txt', 'fast/dom/prototype-taco.html']],
+            [[
+                'python', 'echo', 'copy-existing-baselines-internal',
+                '--test', 'fast/dom/prototype-taco.html',
+                '--suffixes', 'txt',
+                '--port-name', 'test-mac-mac10.11',
+            ]],
+            [[
+                'python', 'echo', 'rebaseline-test-internal',
+                '--test', 'fast/dom/prototype-taco.html',
+                '--suffixes', 'txt',
+                '--port-name', 'test-mac-mac10.11',
+                '--builder', 'MOCK Mac10.11',
+            ]],
+            [[
+                'python', 'echo', 'optimize-baselines',
+                '--suffixes', 'txt',
+                'fast/dom/prototype-taco.html',
+            ]],
             ['git', 'cl', 'upload', '-f'],
         ])
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/optimize_baselines.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/optimize_baselines.py
index 4b0b771..4d57b00e 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/optimize_baselines.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/optimize_baselines.py
@@ -14,13 +14,14 @@
 
 class OptimizeBaselines(AbstractRebaseliningCommand):
     name = 'optimize-baselines'
-    help_text = 'Reshuffles the baselines for the given tests to use as litte space on disk as possible.'
+    help_text = 'Reshuffles the baselines for the given tests to use as little space on disk as possible.'
     show_in_main_help = True
     argument_names = 'TEST_NAMES'
 
     def __init__(self):
         super(OptimizeBaselines, self).__init__(options=[
             self.suffixes_option,
+            self.port_name_option,
         ] + self.platform_options)
 
     def _optimize_baseline(self, optimizer, test_name):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
index bfeb329..b9faf6d 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
@@ -63,7 +63,14 @@
         '--suffixes', default=','.join(BASELINE_SUFFIX_LIST), action='store',
         help='Comma-separated-list of file types to rebaseline.')
     builder_option = optparse.make_option(
-        '--builder', help='Builder to pull new baselines from.')
+        '--builder',
+        help=('Name of the builder to pull new baselines from, '
+              'e.g. "WebKit Mac10.12".'))
+    port_name_option = optparse.make_option(
+        '--port-name',
+        help=('Fully-qualified name of the port that new baselines belong to, '
+              'e.g. "mac-mac10.12". If not given, this is determined based on '
+              '--builder.'))
     test_option = optparse.make_option('--test', help='Test to rebaseline.')
     build_number_option = optparse.make_option(
         '--build-number', default=None, type='int',
@@ -102,16 +109,16 @@
     def __init__(self, lines_to_remove=None):
         self.lines_to_remove = lines_to_remove or {}
 
-    def remove_line(self, test, builder):
+    def remove_line(self, test, port_name):
         if test not in self.lines_to_remove:
             self.lines_to_remove[test] = []
-        self.lines_to_remove[test].append(builder)
+        self.lines_to_remove[test].append(port_name)
 
     def to_dict(self):
         remove_lines = []
         for test in self.lines_to_remove:
-            for builder in self.lines_to_remove[test]:
-                remove_lines.append({'test': test, 'builder': builder})
+            for port_name in self.lines_to_remove[test]:
+                remove_lines.append({'test': test, 'port_name': port_name})
         return {'remove-lines': remove_lines}
 
     @staticmethod
@@ -120,10 +127,10 @@
         if 'remove-lines' in change_dict:
             for line_to_remove in change_dict['remove-lines']:
                 test = line_to_remove['test']
-                builder = line_to_remove['builder']
+                port_name = line_to_remove['port_name']
                 if test not in lines_to_remove:
                     lines_to_remove[test] = []
-                lines_to_remove[test].append(builder)
+                lines_to_remove[test].append(port_name)
         return ChangeSet(lines_to_remove=lines_to_remove)
 
     def update(self, other):
@@ -188,19 +195,22 @@
 
     def __init__(self):
         super(CopyExistingBaselinesInternal, self).__init__(options=[
-            self.results_directory_option,
-            self.suffixes_option,
-            self.builder_option,
             self.test_option,
+            self.suffixes_option,
+            self.port_name_option,
+            self.results_directory_option,
         ])
 
     @memoized
     def _immediate_predecessors_in_fallback(self, path_to_rebaseline):
         """Returns the predecessor directories in the baseline fall-back graph.
 
-        The platform-specific fall-back baseline directories form a tree; the
-        "immediate predecessors" are the children nodes For example, if the
-        baseline fall-back graph includes:
+        The platform-specific fall-back baseline directories form a tree, where
+        when we search for baselines we normally fall back to parents nodes in
+        the tree. The "immediate predecessors" are the children nodes of the
+        given node.
+
+        For example, if the baseline fall-back graph includes:
             "mac10.9" -> "mac10.10/"
             "mac10.10/" -> "mac/"
             "retina/" -> "mac/"
@@ -208,6 +218,13 @@
             "mac/": ["mac10.10/", "retina/"]
             "mac10.10/": ["mac10.9/"]
             "mac10.9/", "retina/": []
+
+        Args:
+            path_to_rebaseline: The absolute path to a baseline directory.
+
+        Returns:
+            A list of directory names (not full paths) of directories that are
+            "immediate predecessors" of the given baseline path.
         """
         port_names = self._tool.port_factory.all_port_names()
         immediate_predecessors = []
@@ -230,9 +247,9 @@
                 return port
         raise Exception('Failed to find port for primary baseline %s.' % baseline)
 
-    def _copy_existing_baseline(self, builder_name, test_name, suffix):
+    def _copy_existing_baseline(self, port_name, test_name, suffix):
         """Copies the baseline for the given builder to all "predecessor" directories."""
-        baseline_directory = self._baseline_directory(builder_name)
+        baseline_directory = self._tool.port_factory.get(port_name).baseline_version_dir()
         ports = [self._port_for_primary_baseline(baseline)
                  for baseline in self._immediate_predecessors_in_fallback(baseline_directory)]
 
@@ -277,8 +294,9 @@
 
     def execute(self, options, args, tool):
         self._tool = tool
+        port_name = options.port_name
         for suffix in options.suffixes.split(','):
-            self._copy_existing_baseline(options.builder, options.test, suffix)
+            self._copy_existing_baseline(port_name, options.test, suffix)
 
 
 class RebaselineTest(AbstractRebaseliningCommand):
@@ -287,11 +305,12 @@
 
     def __init__(self):
         super(RebaselineTest, self).__init__(options=[
-            self.results_directory_option,
-            self.suffixes_option,
-            self.builder_option,
             self.test_option,
+            self.suffixes_option,
+            self.port_name_option,
+            self.builder_option,
             self.build_number_option,
+            self.results_directory_option,
         ])
 
     def _save_baseline(self, data, target_baseline):
@@ -303,8 +322,18 @@
         filesystem.maybe_make_directory(filesystem.dirname(target_baseline))
         filesystem.write_binary_file(target_baseline, data)
 
-    def _rebaseline_test(self, builder_name, test_name, suffix, results_url):
-        baseline_directory = self._baseline_directory(builder_name)
+    def _rebaseline_test(self, port_name, test_name, suffix, results_url):
+        """Downloads a baseline file and saves it to the filesystem.
+
+        Args:
+            port_name: The port that the baseline is for. This determines
+                the directory that the baseline is saved to.
+            test_name: The name of the test being rebaselined.
+            suffix: The baseline file extension (e.g. png); together with the
+                test name and results_url this determines what file to download.
+            results_url: Base URL to download the actual result from.
+        """
+        baseline_directory = self._tool.port_factory.get(port_name).baseline_version_dir()
 
         source_baseline = '%s/%s' % (results_url, self._file_name_for_actual_result(test_name, suffix))
         target_baseline = self._tool.filesystem.join(baseline_directory, self._file_name_for_expected_result(test_name, suffix))
@@ -316,7 +345,9 @@
     def _rebaseline_test_and_update_expectations(self, options):
         self._baseline_suffix_list = options.suffixes.split(',')
 
-        port = self._tool.port_factory.get_from_builder_name(options.builder)
+        port_name = options.port_name or self._tool.builders.port_name_for_builder_name(options.builder)
+        port = self._tool.port_factory.get(port_name)
+
         if port.reference_files(options.test):
             if 'png' in self._baseline_suffix_list:
                 _log.warning('Cannot rebaseline image result for reftest: %s', options.test)
@@ -329,8 +360,8 @@
             results_url = self._tool.buildbot.results_url(options.builder, build_number=options.build_number)
 
         for suffix in self._baseline_suffix_list:
-            self._rebaseline_test(options.builder, options.test, suffix, results_url)
-        self.expectation_line_changes.remove_line(test=options.test, builder=options.builder)
+            self._rebaseline_test(port_name, options.test, suffix, results_url)
+        self.expectation_line_changes.remove_line(test=options.test, port_name=port_name)
 
     def execute(self, options, args, tool):
         self._tool = tool
@@ -414,22 +445,30 @@
             if build.builder_name not in builders_to_fetch_from:
                 continue
 
+            port_name = self._tool.builders.port_name_for_builder_name(build.builder_name)
+
             suffixes = self._suffixes_for_actual_failures(test, build)
             if not suffixes:
                 # If we're not going to rebaseline the test because it's passing on this
                 # builder, we still want to remove the line from TestExpectations.
                 if test not in lines_to_remove:
                     lines_to_remove[test] = []
-                lines_to_remove[test].append(build.builder_name)
+                lines_to_remove[test].append(port_name)
                 continue
 
-            args = ['--suffixes', ','.join(suffixes), '--builder', build.builder_name, '--test', test]
+            args = []
             if options.verbose:
                 args.append('--verbose')
+            args.extend([
+                '--test', test,
+                '--suffixes', ','.join(suffixes),
+                '--port-name', port_name,
+            ])
 
             copy_command = [self._tool.executable, path_to_webkit_patch, 'copy-existing-baselines-internal'] + args
             copy_baseline_commands.append(tuple([copy_command, cwd]))
 
+            args.extend(['--builder', build.builder_name])
             if build.build_number:
                 args.extend(['--build-number', str(build.build_number)])
             if options.results_directory:
@@ -473,9 +512,10 @@
             if not suffixes:
                 continue
             # FIXME: We should propagate the platform options as well.
-            args = ['--suffixes', ','.join(suffixes), test]
+            args = []
             if verbose:
                 args.append('--verbose')
+            args.extend(['--suffixes', ','.join(suffixes), test])
             path_to_webkit_patch = self._tool.path()
             cwd = self._tool.git().checkout_root
             command = [self._tool.executable, path_to_webkit_patch, 'optimize-baselines'] + args
@@ -505,8 +545,8 @@
                             to_remove.append((test, test_configuration))
 
         for test in lines_to_remove:
-            for builder in lines_to_remove[test]:
-                port = self._tool.port_factory.get_from_builder_name(builder)
+            for port_name in lines_to_remove[test]:
+                port = self._tool.port_factory.get(port_name)
                 for test_configuration in port.all_test_configurations():
                     if test_configuration.version == port.test_configuration().version:
                         to_remove.append((test, test_configuration))
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_cl_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_cl_unittest.py
index 56ec066..a018495 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_cl_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_cl_unittest.py
@@ -272,11 +272,25 @@
         self.assertEqual(
             self.tool.executive.calls,
             [
-                [['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt',
-                  '--builder', 'MOCK Try Win', '--test', 'fast/dom/prototype-taco.html']],
-                [['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt',
-                  '--builder', 'MOCK Try Win', '--test', 'fast/dom/prototype-taco.html', '--build-number', '5000']],
-                [['python', 'echo', 'optimize-baselines', '--suffixes', 'txt', 'fast/dom/prototype-taco.html']]
+                [[
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'fast/dom/prototype-taco.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-win-win7',
+                ]],
+                [[
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'fast/dom/prototype-taco.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-win-win7',
+                    '--builder', 'MOCK Try Win',
+                    '--build-number', '5000',
+                ]],
+                [[
+                    'python', 'echo', 'optimize-baselines',
+                    '--suffixes', 'txt',
+                    'fast/dom/prototype-taco.html',
+                ]]
             ])
 
     def test_trigger_builds(self):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
index 09530f6f..a7a3560 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import json
 import optparse
 import unittest
 
@@ -115,6 +116,7 @@
             'results_directory': None,
             'suffixes': 'txt',
             'verbose': False,
+            'port_name': None,
         }
         options_dict.update(kwargs)
         return optparse.Values(options_dict)
@@ -136,7 +138,7 @@
         self.assertFalse(self.tool.filesystem.exists(
             self.baseline_path('platform/test-mac-mac10.10/failures/expected/image-expected.txt')))
 
-        self.command.execute(self.options(builder='MOCK Mac10.11', test='failures/expected/image.html'), [], self.tool)
+        self.command.execute(self.options(port_name='test-mac-mac10.11', test='failures/expected/image.html'), [], self.tool)
 
         self.assertEqual(
             self._read(self.baseline_path('platform/test-mac-mac10.11/failures/expected/image-expected.txt')),
@@ -145,7 +147,7 @@
             self._read(self.baseline_path('platform/test-mac-mac10.10/failures/expected/image-expected.txt')),
             'original test-mac-mac10.11 result')
 
-    def test_copy_baseline_win10_to_linux_trusty_and_win7(self):
+    def test_copy_baseline_to_multiple_immediate_predecessors(self):
         # The test-win-win10 baseline is copied over to the test-linux-trusty
         # and test-win-win7 baseline paths, since both of these are "immediate
         # predecessors".
@@ -155,7 +157,7 @@
         self.assertFalse(self.tool.filesystem.exists(
             self.baseline_path('platform/test-linux-trusty/failures/expected/image-expected.txt')))
 
-        self.command.execute(self.options(builder='MOCK Win10', test='failures/expected/image.html'), [], self.tool)
+        self.command.execute(self.options(port_name='test-win-win10', test='failures/expected/image.html'), [], self.tool)
 
         self.assertEqual(
             self._read(self.baseline_path('platform/test-win-win10/failures/expected/image-expected.txt')),
@@ -178,7 +180,7 @@
             self.baseline_path('platform/test-linux-trusty/failures/expected/image-expected.txt'),
             'original test-linux-trusty result')
 
-        self.command.execute(self.options(builder='MOCK Win10', test='failures/expected/image.html'), [], self.tool)
+        self.command.execute(self.options(port_name='test-win-win10', test='failures/expected/image.html'), [], self.tool)
 
         self.assertEqual(
             self._read(self.baseline_path('platform/test-win-win10/failures/expected/image-expected.txt')),
@@ -200,7 +202,7 @@
             ('[ Win ] failures/expected/image.html [ Failure ]\n'
              '[ Linux ] failures/expected/image.html [ Skip ]\n'))
 
-        self.command.execute(self.options(builder='MOCK Win10', test='failures/expected/image.html'), [], self.tool)
+        self.command.execute(self.options(port_name='test-win-win10', test='failures/expected/image.html'), [], self.tool)
 
         self.assertFalse(
             self.tool.filesystem.exists(self.baseline_path('platform/test-linux-trusty/failures/expected/image-expected.txt')))
@@ -224,6 +226,7 @@
     def options(**kwargs):
         return optparse.Values(dict({
             'builder': 'MOCK Mac10.11',
+            'port_name': None,
             'test': 'userscripts/another-test.html',
             'suffixes': 'txt',
             'results_directory': None,
@@ -264,7 +267,7 @@
              'Bug(A) [ Debug ] : fast/css/large-list-of-rules-crash.html [ Failure ]\n'))
 
     def test_rebaseline_test(self):
-        self.command._rebaseline_test('MOCK Trusty', 'userscripts/another-test.html', 'txt', self.WEB_PREFIX)
+        self.command._rebaseline_test('test-linux-trusty', 'userscripts/another-test.html', 'txt', self.WEB_PREFIX)
         self.assertItemsEqual(self.tool.web.urls_fetched, [self.WEB_PREFIX + '/userscripts/another-test-actual.txt'])
 
     def test_rebaseline_test_with_results_directory(self):
@@ -299,6 +302,7 @@
             options = optparse.Values({
                 'optimize': True,
                 'builder': 'MOCK Win10',
+                'port_name': None,
                 'suffixes': 'txt',
                 'verbose': True,
                 'test': 'failures/expected/image.html',
@@ -318,7 +322,7 @@
         self.assertFalse(self.tool.filesystem.exists(self.tool.filesystem.join(
             port.layout_tests_dir(), 'platform/test-win-win7/failures/expected/image-expected.txt')))
         self.assertMultiLineEqual(
-            out, '{"remove-lines": [{"test": "failures/expected/image.html", "builder": "MOCK Win10"}]}\n')
+            out, '{"remove-lines": [{"test": "failures/expected/image.html", "port_name": "test-win-win10"}]}\n')
 
 
 class TestAbstractParallelRebaselineCommand(BaseTestCase):
@@ -415,12 +419,27 @@
         self.assertEqual(
             self.tool.executive.calls,
             [
-                [['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                  '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose']],
-                [['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png',
-                  '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose']],
-                [['python', 'echo', 'optimize-baselines', '--suffixes', 'txt,png',
-                  'userscripts/first-test.html', '--verbose']]
+                [[
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+                ]],
+                [[
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+                    '--builder', 'MOCK Win7',
+                ]],
+                [[
+                    'python', 'echo', 'optimize-baselines',
+                    '--verbose',
+                    '--suffixes', 'txt,png',
+                    'userscripts/first-test.html',
+                ]]
             ])
 
     def test_rebaseline_debug(self):
@@ -434,12 +453,27 @@
         self.assertEqual(
             self.tool.executive.calls,
             [
-                [['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                  '--builder', 'MOCK Win7 (dbg)', '--test', 'userscripts/first-test.html', '--verbose']],
-                [['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png', '--builder',
-                  'MOCK Win7 (dbg)', '--test', 'userscripts/first-test.html', '--verbose']],
-                [['python', 'echo', 'optimize-baselines', '--suffixes', 'txt,png',
-                  'userscripts/first-test.html', '--verbose']]
+                [[
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+                ]],
+                [[
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+                    '--builder', 'MOCK Win7 (dbg)',
+                ]],
+                [[
+                    'python', 'echo', 'optimize-baselines',
+                    '--verbose',
+                    '--suffixes', 'txt,png',
+                    'userscripts/first-test.html',
+                ]]
             ])
 
     def test_no_optimize(self):
@@ -452,10 +486,22 @@
         self.assertEqual(
             self.tool.executive.calls,
             [
-                [['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                  '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose']],
-                [['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png',
-                  '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose']]
+                [[
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+
+                ]],
+                [[
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+                    '--builder', 'MOCK Win7',
+                ]]
             ])
 
     def test_results_directory(self):
@@ -468,10 +514,21 @@
         self.assertEqual(
             self.tool.executive.calls,
             [
-                [['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                  '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose']],
-                [['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png',
-                  '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose', '--results-directory', '/tmp']]
+                [[
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+                ]],
+                [[
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+                    '--builder', 'MOCK Win7',
+                    '--results-directory', '/tmp']]
             ])
 
     def test_unstaged_baselines(self):
@@ -500,7 +557,7 @@
         self.tool.executive = MockExecutive()
 
         def mock_run_command(*args, **kwargs):  # pylint: disable=unused-argument
-            return '{"add": [], "remove-lines": [{"test": "userscripts/first-test.html", "builder": "MOCK Mac10.11"}]}\n'
+            return '{"add": [], "remove-lines": [{"test": "userscripts/first-test.html", "port_name": "test-mac-mac10.11"}]}\n'
         self.tool.executive.run_command = mock_run_command
 
     @staticmethod
@@ -624,10 +681,21 @@
         self.assertEqual(
             self.tool.executive.calls,
             [
-                [['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                  '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose']],
-                [['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png',
-                  '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose']]
+                [[
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+                ]],
+                [[
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--verbose',
+                    '--test', 'userscripts/first-test.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-win-win7',
+                    '--builder', 'MOCK Win7',
+                ]]
             ])
 
     def test_rebaseline_directory(self):
@@ -650,16 +718,38 @@
             self.tool.executive.calls,
             [
                 [
-                    ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                     '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose'],
-                    ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                     '--builder', 'MOCK Win7', '--test', 'userscripts/second-test.html', '--verbose']
+                    [
+                        'python', 'echo', 'copy-existing-baselines-internal',
+                        '--verbose',
+                        '--test', 'userscripts/first-test.html',
+                        '--suffixes', 'txt,png',
+                        '--port-name', 'test-win-win7',
+                    ],
+                    [
+                        'python', 'echo', 'copy-existing-baselines-internal',
+                        '--verbose',
+                        '--test', 'userscripts/second-test.html',
+                        '--suffixes', 'txt,png',
+                        '--port-name', 'test-win-win7',
+                    ]
                 ],
                 [
-                    ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png',
-                     '--builder', 'MOCK Win7', '--test', 'userscripts/first-test.html', '--verbose'],
-                    ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png',
-                     '--builder', 'MOCK Win7', '--test', 'userscripts/second-test.html', '--verbose']
+                    [
+                        'python', 'echo', 'rebaseline-test-internal',
+                        '--verbose',
+                        '--test', 'userscripts/first-test.html',
+                        '--suffixes', 'txt,png',
+                        '--port-name', 'test-win-win7',
+                        '--builder', 'MOCK Win7',
+                    ],
+                    [
+                        'python', 'echo', 'rebaseline-test-internal',
+                        '--verbose',
+                        '--test', 'userscripts/second-test.html',
+                        '--suffixes', 'txt,png',
+                        '--port-name', 'test-win-win7',
+                        '--builder', 'MOCK Win7',
+                    ]
                 ]
             ])
 
@@ -718,24 +808,60 @@
 
         self.assertEqual(self.tool.executive.calls, [
             [
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.10', '--test', 'userscripts/another-test.html'],
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.11', '--test', 'userscripts/another-test.html'],
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                 '--builder', 'MOCK Mac10.10', '--test', 'userscripts/images.svg'],
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                 '--builder', 'MOCK Mac10.11', '--test', 'userscripts/images.svg'],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'userscripts/another-test.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.10',
+                ],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'userscripts/another-test.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.11',
+                ],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'userscripts/images.svg',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-mac-mac10.10',
+                ],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'userscripts/images.svg',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-mac-mac10.11',
+                ],
             ],
             [
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.10', '--test', 'userscripts/another-test.html'],
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.11', '--test', 'userscripts/another-test.html'],
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png',
-                 '--builder', 'MOCK Mac10.10', '--test', 'userscripts/images.svg'],
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png',
-                 '--builder', 'MOCK Mac10.11', '--test', 'userscripts/images.svg'],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'userscripts/another-test.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.10',
+                    '--builder', 'MOCK Mac10.10',
+                ],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'userscripts/another-test.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.11',
+                    '--builder', 'MOCK Mac10.11',
+                ],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'userscripts/images.svg',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-mac-mac10.10',
+                    '--builder', 'MOCK Mac10.10',
+                ],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'userscripts/images.svg',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-mac-mac10.11',
+                    '--builder', 'MOCK Mac10.11',
+                ],
             ],
         ])
 
@@ -777,16 +903,34 @@
 
         self.assertEqual(self.tool.executive.calls, [
             [
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.10', '--test', 'userscripts/reftest-text.html'],
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.11', '--test', 'userscripts/reftest-text.html'],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'userscripts/reftest-text.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.10',
+                ],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'userscripts/reftest-text.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.11',
+                ],
             ],
             [
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.10', '--test', 'userscripts/reftest-text.html'],
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.11', '--test', 'userscripts/reftest-text.html'],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'userscripts/reftest-text.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.10',
+                    '--builder', 'MOCK Mac10.10',
+                ],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'userscripts/reftest-text.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.11',
+                    '--builder', 'MOCK Mac10.11',
+                ],
             ],
         ])
 
@@ -899,20 +1043,47 @@
 
         self.assertEqual(self.tool.executive.calls, [
             [
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.10', '--test', 'fast/dom/missing-text.html'],
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png',
-                 '--builder', 'MOCK Mac10.10', '--test', 'fast/dom/missing-text-and-image.html'],
-                ['python', 'echo', 'copy-existing-baselines-internal', '--suffixes', 'png',
-                 '--builder', 'MOCK Mac10.10', '--test', 'fast/dom/missing-image.html'],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'fast/dom/missing-text.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.10',
+                ],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'fast/dom/missing-text-and-image.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-mac-mac10.10',
+                ],
+                [
+                    'python', 'echo', 'copy-existing-baselines-internal',
+                    '--test', 'fast/dom/missing-image.html',
+                    '--suffixes', 'png',
+                    '--port-name', 'test-mac-mac10.10',
+                ],
             ],
             [
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt',
-                 '--builder', 'MOCK Mac10.10', '--test', 'fast/dom/missing-text.html'],
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'txt,png',
-                 '--builder', 'MOCK Mac10.10', '--test', 'fast/dom/missing-text-and-image.html'],
-                ['python', 'echo', 'rebaseline-test-internal', '--suffixes', 'png',
-                 '--builder', 'MOCK Mac10.10', '--test', 'fast/dom/missing-image.html'],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'fast/dom/missing-text.html',
+                    '--suffixes', 'txt',
+                    '--port-name', 'test-mac-mac10.10',
+                    '--builder', 'MOCK Mac10.10',
+                ],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'fast/dom/missing-text-and-image.html',
+                    '--suffixes', 'txt,png',
+                    '--port-name', 'test-mac-mac10.10',
+                    '--builder', 'MOCK Mac10.10',
+                ],
+                [
+                    'python', 'echo', 'rebaseline-test-internal',
+                    '--test', 'fast/dom/missing-image.html',
+                    '--suffixes', 'png',
+                    '--port-name', 'test-mac-mac10.10',
+                    '--builder', 'MOCK Mac10.10',
+                ],
             ]
         ])
 
@@ -927,7 +1098,9 @@
         for cmd_line, cwd in commands:
             out = self.run_command(cmd_line, cwd=cwd)
             if 'rebaseline-test-internal' in cmd_line:
-                out = '{"remove-lines": [{"test": "%s", "builder": "%s"}]}\n' % (cmd_line[8], cmd_line[6])
+                test = cmd_line[cmd_line.index('--test') + 1]
+                port_name = cmd_line[cmd_line.index('--port-name') + 1]
+                out = json.dumps({'remove-lines': [{'test': test, 'port_name': port_name}]})
             command_outputs.append([0, out, ''])
 
         new_calls = self.calls[num_previous_calls:]
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn
index f06c643..7c1d81fd 100644
--- a/third_party/WebKit/public/BUILD.gn
+++ b/third_party/WebKit/public/BUILD.gn
@@ -404,6 +404,7 @@
     "platform/modules/screen_orientation/WebLockOrientationCallback.h",
     "platform/modules/screen_orientation/WebLockOrientationError.h",
     "platform/modules/screen_orientation/WebScreenOrientationClient.h",
+    "platform/modules/screen_orientation/WebScreenOrientationEnumTraits.h",
     "platform/modules/screen_orientation/WebScreenOrientationLockType.h",
     "platform/modules/screen_orientation/WebScreenOrientationType.h",
     "platform/modules/serviceworker/WebNavigationPreloadState.h",
diff --git a/third_party/WebKit/public/platform/modules/background_fetch/background_fetch.mojom b/third_party/WebKit/public/platform/modules/background_fetch/background_fetch.mojom
index da50934..2ed9ea4 100644
--- a/third_party/WebKit/public/platform/modules/background_fetch/background_fetch.mojom
+++ b/third_party/WebKit/public/platform/modules/background_fetch/background_fetch.mojom
@@ -4,6 +4,8 @@
 
 module blink.mojom;
 
+import "url/mojo/origin.mojom";
+
 enum BackgroundFetchError {
   NONE,
   DUPLICATED_TAG,
@@ -42,6 +44,7 @@
   // Creates a new Background Fetch registration identified by |tag| with the
   // given |options| for the sequence of |requests|.
   Fetch(int64 service_worker_registration_id,
+        url.mojom.Origin origin,
         string tag,
         BackgroundFetchOptions options)
       => (BackgroundFetchError error,
@@ -49,23 +52,30 @@
 
   // Updates the user interface for the Background Fetch identified by the
   // |service_worker_registration_id| and the |tag|.
-  UpdateUI(int64 service_worker_registration_id, string tag, string title)
+  UpdateUI(int64 service_worker_registration_id,
+           url.mojom.Origin origin,
+           string tag,
+           string title)
       => (BackgroundFetchError error);
 
   // Aborts the Background Fetch registration identified by the
   // |service_worker_registration_id| and the |tag|.
-  Abort(int64 service_worker_registration_id, string tag)
+  Abort(int64 service_worker_registration_id,
+        url.mojom.Origin origin,
+        string tag)
       => (BackgroundFetchError error);
 
   // Gets the Background Fetch registration identified by the
   // |service_worker_registration_id| and the |tag|.
-  GetRegistration(int64 service_worker_registration_id, string tag)
+  GetRegistration(int64 service_worker_registration_id,
+                  url.mojom.Origin origin,
+                  string tag)
       => (BackgroundFetchError error,
           BackgroundFetchRegistration? registration);
 
   // Gets the sequence of tags for active Background Fetch registrations given
   // the |service_worker_registration_id|.
-  GetTags(int64 service_worker_registration_id)
+  GetTags(int64 service_worker_registration_id, url.mojom.Origin origin)
       => (BackgroundFetchError error,
           array<string> tags);
 };
diff --git a/third_party/closure_compiler/externs/accessibility_private.js b/third_party/closure_compiler/externs/accessibility_private.js
index 8bbd66c..f4cf5d3 100644
--- a/third_party/closure_compiler/externs/accessibility_private.js
+++ b/third_party/closure_compiler/externs/accessibility_private.js
@@ -1,4 +1,4 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -93,6 +93,13 @@
 chrome.accessibilityPrivate.setKeyboardListener = function(enabled, capture) {};
 
 /**
+ * Darkens or undarkens the screen.
+ * @param {boolean} enabled True to darken screen; false to undarken screen.
+ * @see https://developer.chrome.com/extensions/accessibilityPrivate#method-darkenScreen
+ */
+chrome.accessibilityPrivate.darkenScreen = function(enabled) {};
+
+/**
  * Fired whenever ChromeVox should output introduction.
  * @type {!ChromeEvent}
  * @see https://developer.chrome.com/extensions/accessibilityPrivate#event-onIntroduceChromeVox
diff --git a/third_party/instrumented_libraries/BUILD.gn b/third_party/instrumented_libraries/BUILD.gn
index 9d7636a8..4d1e910b 100644
--- a/third_party/instrumented_libraries/BUILD.gn
+++ b/third_party/instrumented_libraries/BUILD.gn
@@ -57,18 +57,27 @@
     }
   }
 
-  # TODO(GYP): scripts/download_binaries.py uses GYP_DEFINES to decide whether
-  # to download the archives extracted here.
+  action("download_prebuilt_instrumented_libraries") {
+    tarfile_name = "$archive_prefix-$instrumented_libraries_platform.tgz"
+    shafile = "binaries/$tarfile_name.sha1"
+    tarfile = "$target_out_dir/$tarfile_name"
+    inputs = [ shafile ]
+    outputs = [ tarfile ]
+    script = "scripts/download_binaries.py"
+    args = [ rebase_path(shafile), rebase_path(tarfile) ]
+  }
+
   # Note: This requires a clobber whenever Ubuntu version changes.
   action("extract_prebuilt_instrumented_libraries") {
+    deps = [ ":download_prebuilt_instrumented_libraries" ]
     visibility = [ ":prebuilt" ]
     script = "scripts/unpack_binaries.py"
     depfile = "$target_out_dir/$archive_prefix.d"
+    tarfile = get_target_outputs(":download_prebuilt_instrumented_libraries")
     args = [
-      archive_prefix,
-      rebase_path("binaries"),
+      rebase_path(tarfile[0]),
+      rebase_path("$target_out_dir/$archive_prefix.txt"),
       rebase_path(root_out_dir + "/instrumented_libraries_prebuilt"),
-      rebase_path(target_out_dir, root_out_dir),
     ]
     outputs = [
       "$target_out_dir/$archive_prefix.txt",
diff --git a/third_party/instrumented_libraries/scripts/download_binaries.py b/third_party/instrumented_libraries/scripts/download_binaries.py
index b7e87b2e..fa339cc 100755
--- a/third_party/instrumented_libraries/scripts/download_binaries.py
+++ b/third_party/instrumented_libraries/scripts/download_binaries.py
@@ -3,69 +3,34 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""Downloads pre-built sanitizer-instrumented third-party libraries from GCS."""
+"""Downloads pre-built sanitizer-instrumented third-party libraries from GCS.
+This script should only be run from gn.
+"""
 
-import os
-import re
 import subprocess
 import sys
 
 
-SCRIPT_PATH = os.path.abspath(__file__)
-BASE_PATH = os.path.normpath(os.path.join(SCRIPT_PATH, *(4 * ['..'])))
-
-# This defaults to the consuming project's base directory, e.g. 'src' in
-# chromium.
-BASE_DIR = os.path.basename(BASE_PATH)
-
-
-def get_ubuntu_release():
-  supported_releases = ['trusty']
-  release = subprocess.check_output(['lsb_release', '-cs']).strip()
-  if release not in supported_releases:
-    raise Exception("Supported Ubuntu versions: %s", str(supported_releases))
-  return release
-
-
-def get_configuration(gyp_defines):
-  if re.search(r'\b(msan)=1', gyp_defines):
-    if 'msan_track_origins=0' in gyp_defines:
-      return 'msan-no-origins'
-    if 'msan_track_origins=2' in gyp_defines:
-      return 'msan-chained-origins'
-    if 'msan_track_origins=' not in gyp_defines:
-      # NB: must be the same as the default value in common.gypi
-      return 'msan-chained-origins'
-  raise Exception(
-      "Prebuilt instrumented libraries not available for your configuration.")
-
-
-def get_archive_name(gyp_defines):
-  return "%s-%s.tgz" % (get_configuration(gyp_defines), get_ubuntu_release())
-
-
 def main(args):
-  gyp_defines = os.environ.get('GYP_DEFINES', '')
-  if not 'use_prebuilt_instrumented_libraries=1' in gyp_defines:
-    return 0
-
   if not sys.platform.startswith('linux'):
-    raise Exception("'use_prebuilt_instrumented_libraries=1' requires Linux.")
+    raise Exception("Prebuilt instrumented libraries require Linux.")
 
-  archive_name = get_archive_name(gyp_defines)
-  sha1file = '%s.sha1' % archive_name
-  target_directory = os.path.join(
-      BASE_DIR, 'third_party', 'instrumented_libraries', 'binaries')
+  sha1file = args[0]
+  tarfile = args[1]
 
   subprocess.check_call([
       'download_from_google_storage',
       '--no_resume',
       '--no_auth',
       '--bucket', 'chromium-instrumented-libraries',
-      '-s', sha1file], cwd=target_directory)
+      '-s', sha1file, '-o', tarfile])
 
   return 0
 
 
 if __name__ == '__main__':
+  # TODO(thomasanderson): Remove this once all third_party DEPS
+  # entires for this script are removed.
+  if (len(sys.argv) == 1):
+    sys.exit(0)
   sys.exit(main(sys.argv[1:]))
diff --git a/third_party/instrumented_libraries/scripts/unpack_binaries.py b/third_party/instrumented_libraries/scripts/unpack_binaries.py
index 3e17790..2f335bc 100755
--- a/third_party/instrumented_libraries/scripts/unpack_binaries.py
+++ b/third_party/instrumented_libraries/scripts/unpack_binaries.py
@@ -3,38 +3,27 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""Unpacks pre-built sanitizer-instrumented third-party libraries."""
+"""Unpacks pre-built sanitizer-instrumented third-party libraries.
+This script should only be run by gn.
+"""
 
 import os
 import subprocess
 import shutil
 import sys
 
-import download_binaries
 
-
-def get_archive_name(archive_prefix):
-  return '%s-%s.tgz' % (archive_prefix, download_binaries.get_ubuntu_release())
-
-
-def main(archive_prefix, archive_dir, target_dir, stamp_dir=None):
+def main(archive, stamp_file, target_dir):
   shutil.rmtree(target_dir, ignore_errors=True)
 
   os.mkdir(target_dir)
   subprocess.check_call([
       'tar',
       '-zxf',
-      os.path.join(archive_dir, get_archive_name(archive_prefix)),
+      archive,
       '-C',
       target_dir])
-  stamp_file = os.path.join(stamp_dir or target_dir, '%s.txt' % archive_prefix)
   open(stamp_file, 'w').close()
-
-  if stamp_dir:
-    with open(os.path.join(stamp_dir, '%s.d' % archive_prefix), 'w') as f:
-      f.write('%s: %s' % (
-          stamp_file, os.path.join(archive_dir,
-                                   get_archive_name(archive_prefix))))
   return 0
 
 
diff --git a/third_party/sqlite/OWNERS b/third_party/sqlite/OWNERS
index 8b2a655..fbe4ac8 100644
--- a/third_party/sqlite/OWNERS
+++ b/third_party/sqlite/OWNERS
@@ -3,3 +3,6 @@
 
 # Owners:
 michaeln@chromium.org
+
+# TEAM: storage-dev@chromium.org
+# COMPONENT: Blink>Storage
diff --git a/tools/checklicenses/checklicenses.py b/tools/checklicenses/checklicenses.py
index 3d27b0f2..0e28311 100755
--- a/tools/checklicenses/checklicenses.py
+++ b/tools/checklicenses/checklicenses.py
@@ -649,6 +649,10 @@
 
     # Don't check sysroot directories
     'build/linux/debian_jessie_arm64-sysroot',
+    'build/linux/debian_jessie_amd64-sysroot',
+    'build/linux/debian_jessie_arm-sysroot',
+    'build/linux/debian_jessie_i386-sysroot',
+    'build/linux/debian_jessie_mips-sysroot',
     'build/linux/debian_wheezy_amd64-sysroot',
     'build/linux/debian_wheezy_arm-sysroot',
     'build/linux/debian_wheezy_i386-sysroot',
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp
index 43b064c..d263a8cc 100644
--- a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp
+++ b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp
@@ -33,10 +33,6 @@
     for (const auto& arg : args) {
       if (arg == "dump-graph") {
         options_.dump_graph = true;
-      } else if (arg == "warn-stack-allocated-trace-method") {
-        // TODO(sof): after next roll, remove this option to round out
-        // crbug.com/689874
-        continue;
       } else if (arg == "warn-unneeded-finalizer") {
         options_.warn_unneeded_finalizer = true;
       } else if (arg == "use-chromium-style-naming") {
diff --git a/tools/clang/blink_gc_plugin/tests/legacy_naming/stack_allocated.flags b/tools/clang/blink_gc_plugin/tests/legacy_naming/stack_allocated.flags
deleted file mode 100644
index 7ec7af4..0000000
--- a/tools/clang/blink_gc_plugin/tests/legacy_naming/stack_allocated.flags
+++ /dev/null
@@ -1 +0,0 @@
--Xclang -plugin-arg-blink-gc-plugin -Xclang warn-stack-allocated-trace-method
\ No newline at end of file
diff --git a/tools/clang/blink_gc_plugin/tests/stack_allocated.flags b/tools/clang/blink_gc_plugin/tests/stack_allocated.flags
deleted file mode 100644
index 7ec7af4..0000000
--- a/tools/clang/blink_gc_plugin/tests/stack_allocated.flags
+++ /dev/null
@@ -1 +0,0 @@
--Xclang -plugin-arg-blink-gc-plugin -Xclang warn-stack-allocated-trace-method
\ No newline at end of file
diff --git a/tools/copyright_scanner/copyright_scanner.py b/tools/copyright_scanner/copyright_scanner.py
index 6e99354..c6118aa 100644
--- a/tools/copyright_scanner/copyright_scanner.py
+++ b/tools/copyright_scanner/copyright_scanner.py
@@ -70,13 +70,14 @@
     path_join('build', 'goma', 'client'),
     # Ignore sysroots.
     path_join('build', 'linux', 'debian_jessie_arm64-sysroot'),
+    path_join('build', 'linux', 'debian_jessie_arm-sysroot'),
+    path_join('build', 'linux', 'debian_jessie_mips-sysroot'),
+    path_join('build', 'linux', 'debian_jessie_i386-sysroot'),
     path_join('build', 'linux', 'debian_wheezy_amd64-sysroot'),
     path_join('build', 'linux', 'debian_wheezy_arm-sysroot'),
     path_join('build', 'linux', 'debian_wheezy_mips-sysroot'),
     path_join('build', 'linux', 'debian_wheezy_i386-sysroot'),
     path_join('build', 'linux', 'ubuntu_precise_amd64-sysroot'),
-    # Old location (TODO(sbc): Remove this once it no longer exists on any bots)
-    path_join('chrome', 'installer', 'linux', 'debian_wheezy_arm-sysroot'),
     # Data is not part of open source chromium, but are included on some bots.
     path_join('data'),
     # This is not part of open source chromium, but are included on some bots.
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index bcc80bf..9960d45e 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -1834,7 +1834,7 @@
                   'ozone_platform="x11" '
                   'ozone_platform_x11=true ozone_platform_gbm=true '
                   'enable_package_mash_services=true use_ash=false '
-                  'use_jessie_sysroot=true use_xkbcommon=true'),
+                  'use_xkbcommon=true'),
     },
 
     'pdf_xfa': {
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index f010874f..e4300f4 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -1877,6 +1877,16 @@
   </summary>
 </histogram>
 
+<histogram name="Ash.Rotation.AnimationSmoothness" units="%">
+  <owner>wutao@chromium.org</owner>
+  <summary>
+    Relative smoothness of animations when rotating screen. 100% represents
+    ideally smooth 60 frames per second. 50% represents only 30 frames per
+    second is achieved during the animations. 0% should not happen. This metric
+    is recorded exactly once when the user rotates the screen.
+  </summary>
+</histogram>
+
 <histogram name="Ash.Shelf.Menu.NumItemsEnabledUponSelection" units="Count">
   <owner>bruthig@google.com</owner>
   <owner>tdanderson@google.com</owner>
@@ -2196,6 +2206,15 @@
   </summary>
 </histogram>
 
+<histogram name="Ash.Wallpaper.ColorExtractionResult" enum="BooleanSuccess">
+  <owner>bruthig@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    Tracks the success rate for wallpaper color extraction. Recorded each time
+    the wallpaper image changes.
+  </summary>
+</histogram>
+
 <histogram name="Ash.Wallpaper.CustomLayout" enum="WallpaperLayout">
   <owner>xdai@chromium.org</owner>
   <summary>
@@ -47695,6 +47714,54 @@
   </summary>
 </histogram>
 
+<histogram name="PasswordProtection.PasswordProtectionResponseOrErrorCode"
+    enum="CombinedHttpResponseAndNetErrorCode">
+  <owner>jialiul@chromium.org</owner>
+  <owner>nparker@chromium.org</owner>
+  <summary>
+    Response or error codes for PasswordProtectionRequest. Logged after chrome
+    receives response of PasswordProtectionRequest from Safe Browsing service.
+  </summary>
+</histogram>
+
+<histogram name="PasswordProtection.PasswordReuseEventVerdict"
+    enum="PasswordProtectionVerdict">
+  <owner>jialiul@chromium.org</owner>
+  <owner>nparker@chromium.org</owner>
+  <summary>
+    Verdict types returned by Safe Browsing server for password reuse events.
+  </summary>
+</histogram>
+
+<histogram name="PasswordProtection.RequestNetworkDuration" units="ms">
+  <owner>jialiul@chromium.org</owner>
+  <owner>nparker@chromium.org</owner>
+  <summary>
+    The time it takes for PasswordProtectionService request. It is not recorded
+    for requests that were canceled.
+  </summary>
+</histogram>
+
+<histogram name="PasswordProtection.RequestOutcome"
+    enum="PasswordProtectionRequestOutcome">
+  <owner>jialiul@chromium.org</owner>
+  <owner>nparker@chromium.org</owner>
+  <summary>
+    Records the outcome of the password protection request, indicating if
+    request is sent out successfully or if it is skipped or canceled for some
+    reason.
+  </summary>
+</histogram>
+
+<histogram name="PasswordProtection.UnfamiliarLoginPageVerdict"
+    enum="PasswordProtectionVerdict">
+  <owner>jialiul@chromium.org</owner>
+  <owner>nparker@chromium.org</owner>
+  <summary>
+    Verdict types returned by Safe Browsing server for unfamiliar login pages.
+  </summary>
+</histogram>
+
 <histogram
     name="PaymentRequest.CanMakePayment.NotUsed.WithShowEffectOnCompletion"
     enum="PaymentRequestFlowCompletionStatus">
@@ -53659,12 +53726,11 @@
   </summary>
 </histogram>
 
-<histogram name="Previews.EligibilityReason.Offline"
-    enum="PreviewsEligibilityReason">
+<histogram name="Previews.EligibilityReason" enum="PreviewsEligibilityReason">
   <owner>ryansturm@chromium.org</owner>
   <summary>
-    Whether an offline preview was allowed to be shown or the reason the preview
-    could not be shown to the user.
+    Whether a particular preview was allowed to be shown or the reason the
+    preview could not be shown to the user.
   </summary>
 </histogram>
 
@@ -91519,6 +91585,7 @@
   <int value="1166" label="NETWORKINGCASTPRIVATE_VERIFYANDENCRYPTDATA"/>
   <int value="1167" label="NETWORKINGCASTPRIVATE_SETWIFITDLSENABLEDSTATE"/>
   <int value="1168" label="NETWORKINGCASTPRIVATE_GETWIFITDLSSTATUS"/>
+  <int value="1169" label="ACCESSIBILITY_PRIVATE_DARKENSCREEN"/>
 </enum>
 
 <enum name="ExtensionIconState" type="int">
@@ -99949,6 +100016,7 @@
   <int value="-1363709707" label="MaterialDesignHistory:disabled"/>
   <int value="-1358669137" label="enable-supervised-user-blacklist"/>
   <int value="-1357655121" label="enable-iframe-based-signin"/>
+  <int value="-1349896789" label="DelayNavigation:enabled"/>
   <int value="-1349872906"
       label="disallow-autofill-sync-credential-for-reauth"/>
   <int value="-1349532167" label="enable-wifi-credential-sync"/>
@@ -100624,6 +100692,7 @@
   <int value="1460958818" label="NTPForeignSessionsSuggestions:enabled"/>
   <int value="1465624446" label="disable-zero-copy"/>
   <int value="1466380480" label="enable-device-discovery-notifications"/>
+  <int value="1466502102" label="DelayNavigation:disabled"/>
   <int value="1469407485" label="disable-accelerated-2d-canvas"/>
   <int value="1479248574" label="disable-voice-input"/>
   <int value="1481562816" label="disable-password-link"/>
@@ -105417,6 +105486,28 @@
   <int value="12" label="Clicked the link passwords.google.com"/>
 </enum>
 
+<enum name="PasswordProtectionRequestOutcome" type="int">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Succeeded"/>
+  <int value="2" label="Canceled"/>
+  <int value="3" label="Timed out"/>
+  <int value="4" label="Matched whitelist"/>
+  <int value="5" label="Response already cached"/>
+  <int value="6" label="Not extended reporting user"/>
+  <int value="7" label="Incognito"/>
+  <int value="8" label="Request malformed"/>
+  <int value="9" label="Fetch failed"/>
+  <int value="10" label="Response malformed"/>
+  <int value="11" label="Service destroyed"/>
+</enum>
+
+<enum name="PasswordProtectionVerdict" type="int">
+  <int value="0" label="Verdict not specified"/>
+  <int value="1" label="Safe"/>
+  <int value="2" label="Low reputation"/>
+  <int value="3" label="Phishing"/>
+</enum>
+
 <enum name="PasswordReusePasswordFieldDetected" type="int">
   <int value="0" label="No password field"/>
   <int value="1" label="Has password field"/>
@@ -120626,6 +120717,7 @@
   <suffix name="AfterPaint"
       label="Limited to the duration of time starting after first paint, for
              page loads that reached first paint."/>
+  <suffix name="NoCommit" label="Limited to page loads that did not commit."/>
   <affected-histogram name="PageLoad.PageTiming.ForegroundDuration"/>
 </histogram_suffixes>
 
@@ -121737,6 +121829,12 @@
   <affected-histogram name="Prerender.TimeUntilUsed2"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="Previews.Types" separator=".">
+  <suffix name="Offline" label="Offline previews"/>
+  <suffix name="ClientLoFi" label="Client LoFi previews"/>
+  <affected-histogram name="Previews.EligibilityReason"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="ProcessType" separator=".">
   <suffix name="BrowserProcess" label="Browser Process"/>
   <suffix name="RendererProcess"
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index d99b014..b4500d67 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -260,7 +260,6 @@
     "//base:i18n",
     "//base/third_party/dynamic_annotations",
     "//skia",
-    "//third_party/qcms",
     "//third_party/zlib",
   ]
 
@@ -527,6 +526,17 @@
     "//base",
     "//ui/gfx/geometry",
   ]
+
+  if (is_linux) {
+    sources += [
+      "linux/client_native_pixmap_dmabuf.cc",
+      "linux/client_native_pixmap_dmabuf.h",
+      "linux/client_native_pixmap_factory_dmabuf.cc",
+      "linux/client_native_pixmap_factory_dmabuf.h",
+    ]
+
+    deps += [ "//third_party/libdrm" ]
+  }
 }
 
 static_library("test_support") {
diff --git a/ui/gfx/DEPS b/ui/gfx/DEPS
index 1a4d270..6cd8a7d 100644
--- a/ui/gfx/DEPS
+++ b/ui/gfx/DEPS
@@ -4,7 +4,6 @@
   "+skia/ext",
   "+third_party/harfbuzz-ng",
   "+third_party/skia",
-  "+third_party/qcms",
   "+ui/ios",
 
   "-testing/gmock",
diff --git a/ui/gfx/color_space.cc b/ui/gfx/color_space.cc
index 38f8bff..7b5421d 100644
--- a/ui/gfx/color_space.cc
+++ b/ui/gfx/color_space.cc
@@ -407,11 +407,11 @@
 
   // Use the named sRGB and linear transfer functions.
   if (transfer_ == TransferID::IEC61966_2_1) {
-    return SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma,
+    return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
                                  to_xyz_d50);
   }
   if (transfer_ == TransferID::LINEAR || transfer_ == TransferID::LINEAR_HDR) {
-    return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
+    return SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma,
                                  to_xyz_d50);
   }
 
diff --git a/ui/gfx/color_transform.cc b/ui/gfx/color_transform.cc
index af0e058c..d2570c28 100644
--- a/ui/gfx/color_transform.cc
+++ b/ui/gfx/color_transform.cc
@@ -13,18 +13,13 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
-#include "third_party/qcms/src/qcms.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "third_party/skia/include/core/SkColorSpaceXform.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/icc_profile.h"
 #include "ui/gfx/skia_color_space_util.h"
 #include "ui/gfx/transform.h"
 
-#ifndef THIS_MUST_BE_INCLUDED_AFTER_QCMS_H
-extern "C" {
-#include "third_party/qcms/src/chain.h"
-};
-#endif
-
 using std::abs;
 using std::copysign;
 using std::exp;
@@ -52,16 +47,6 @@
   return ss.str();
 }
 
-// Helper for scoped QCMS profiles.
-struct QcmsProfileDeleter {
-  void operator()(qcms_profile* p) {
-    if (p) {
-      qcms_profile_release(p);
-    }
-  }
-};
-using ScopedQcmsProfile = std::unique_ptr<qcms_profile, QcmsProfileDeleter>;
-
 Transform Invert(const Transform& t) {
   Transform ret = t;
   if (!t.GetInverse(&ret)) {
@@ -242,7 +227,7 @@
 class ColorTransformToBT2020CL;
 class ColorTransformFromBT2020CL;
 class ColorTransformNull;
-class QCMSColorTransform;
+class SkiaColorTransform;
 
 class ColorTransformStep {
  public:
@@ -254,7 +239,7 @@
   virtual ColorTransformSkTransferFn* GetSkTransferFn() { return nullptr; }
   virtual ColorTransformMatrix* GetMatrix() { return nullptr; }
   virtual ColorTransformNull* GetNull() { return nullptr; }
-  virtual QCMSColorTransform* GetQCMS() { return nullptr; }
+  virtual SkiaColorTransform* GetSkia() { return nullptr; }
 
   // Join methods, returns true if the |next| transform was successfully
   // assimilated into |this|.
@@ -281,8 +266,8 @@
 
 class ColorTransformInternal : public ColorTransform {
  public:
-  ColorTransformInternal(const ColorSpace& from,
-                         const ColorSpace& to,
+  ColorTransformInternal(const ColorSpace& src,
+                         const ColorSpace& dst,
                          Intent intent);
   ~ColorTransformInternal() override;
 
@@ -299,15 +284,14 @@
   size_t NumberOfStepsForTesting() const override { return steps_.size(); }
 
  private:
-  void AppendColorSpaceToColorSpaceTransform(ColorSpace from,
-                                             const ColorSpace& to,
+  void AppendColorSpaceToColorSpaceTransform(ColorSpace src,
+                                             const ColorSpace& dst,
                                              ColorTransform::Intent intent);
   void Simplify();
 
-  // Retrieve the ICC profile from which |color_space| was created, only if that
-  // is a more precise representation of the color space than the primaries and
-  // transfer function in |color_space|.
-  ScopedQcmsProfile GetQCMSProfileIfNecessary(const ColorSpace& color_space);
+  // Retrieve the SkColorSpace for the ICC profile from which |color_space| was
+  // created, only if that is a more precise than the parametric representation.
+  sk_sp<SkColorSpace> GetSkColorSpaceIfNecessary(const ColorSpace& color_space);
 
   std::list<std::unique_ptr<ColorTransformStep>> steps_;
   gfx::ColorSpace src_;
@@ -817,11 +801,11 @@
 };
 
 void ColorTransformInternal::AppendColorSpaceToColorSpaceTransform(
-    ColorSpace from,
-    const ColorSpace& to,
+    ColorSpace src,
+    const ColorSpace& dst,
     ColorTransform::Intent intent) {
   if (intent == ColorTransform::Intent::INTENT_PERCEPTUAL) {
-    switch (from.transfer_) {
+    switch (src.transfer_) {
       case ColorSpace::TransferID::BT709:
       case ColorSpace::TransferID::SMPTE170M:
         // SMPTE 1886 suggests that we should be using gamma 2.4 for BT709
@@ -829,23 +813,23 @@
         // user studies shows that users don't really care. Using the same
         // gamma as the display will let us optimize a lot more, so lets stick
         // with using the SRGB transfer function.
-        from.transfer_ = ColorSpace::TransferID::IEC61966_2_1;
+        src.transfer_ = ColorSpace::TransferID::IEC61966_2_1;
         break;
 
       case ColorSpace::TransferID::SMPTEST2084:
-        if (!to.IsHDR()) {
+        if (!dst.IsHDR()) {
           // We don't have an HDR display, so replace SMPTE 2084 with
           // something that returns ranges more or less suitable for a normal
           // display.
-          from.transfer_ = ColorSpace::TransferID::SMPTEST2084_NON_HDR;
+          src.transfer_ = ColorSpace::TransferID::SMPTEST2084_NON_HDR;
         }
         break;
 
       case ColorSpace::TransferID::ARIB_STD_B67:
-        if (!to.IsHDR()) {
+        if (!dst.IsHDR()) {
           // Interpreting HLG using a gamma 2.4 works reasonably well for SDR
           // displays.
-          from.transfer_ = ColorSpace::TransferID::GAMMA24;
+          src.transfer_ = ColorSpace::TransferID::GAMMA24;
         }
         break;
 
@@ -857,140 +841,132 @@
   }
 
   steps_.push_back(
-      base::MakeUnique<ColorTransformMatrix>(GetRangeAdjustMatrix(from)));
+      base::MakeUnique<ColorTransformMatrix>(GetRangeAdjustMatrix(src)));
 
   steps_.push_back(
-      base::MakeUnique<ColorTransformMatrix>(Invert(GetTransferMatrix(from))));
+      base::MakeUnique<ColorTransformMatrix>(Invert(GetTransferMatrix(src))));
 
   // If the target color space is not defined, just apply the adjust and
   // tranfer matrices. This path is used by YUV to RGB color conversion
   // when full color conversion is not enabled.
-  if (!to.IsValid())
+  if (!dst.IsValid())
     return;
 
-  SkColorSpaceTransferFn to_linear_fn;
-  if (from.GetTransferFunction(&to_linear_fn)) {
+  SkColorSpaceTransferFn src_to_linear_fn;
+  if (src.GetTransferFunction(&src_to_linear_fn)) {
     steps_.push_back(base::MakeUnique<ColorTransformSkTransferFn>(
-        to_linear_fn, from.HasExtendedSkTransferFn()));
-  } else if (from.transfer_ == ColorSpace::TransferID::SMPTEST2084_NON_HDR) {
+        src_to_linear_fn, src.HasExtendedSkTransferFn()));
+  } else if (src.transfer_ == ColorSpace::TransferID::SMPTEST2084_NON_HDR) {
     steps_.push_back(
         base::MakeUnique<ColorTransformSMPTEST2048NonHdrToLinear>());
   } else {
-    steps_.push_back(base::MakeUnique<ColorTransformToLinear>(from.transfer_));
+    steps_.push_back(base::MakeUnique<ColorTransformToLinear>(src.transfer_));
   }
 
-  if (from.matrix_ == ColorSpace::MatrixID::BT2020_CL) {
+  if (src.matrix_ == ColorSpace::MatrixID::BT2020_CL) {
     // BT2020 CL is a special case.
     steps_.push_back(base::MakeUnique<ColorTransformFromBT2020CL>());
   }
   steps_.push_back(
-      base::MakeUnique<ColorTransformMatrix>(GetPrimaryTransform(from)));
+      base::MakeUnique<ColorTransformMatrix>(GetPrimaryTransform(src)));
 
   steps_.push_back(
-      base::MakeUnique<ColorTransformMatrix>(Invert(GetPrimaryTransform(to))));
-  if (to.matrix_ == ColorSpace::MatrixID::BT2020_CL) {
+      base::MakeUnique<ColorTransformMatrix>(Invert(GetPrimaryTransform(dst))));
+  if (dst.matrix_ == ColorSpace::MatrixID::BT2020_CL) {
     // BT2020 CL is a special case.
     steps_.push_back(base::MakeUnique<ColorTransformToBT2020CL>());
   }
 
-  SkColorSpaceTransferFn from_linear_fn;
-  if (to.GetInverseTransferFunction(&from_linear_fn)) {
+  SkColorSpaceTransferFn dst_from_linear_fn;
+  if (dst.GetInverseTransferFunction(&dst_from_linear_fn)) {
     steps_.push_back(base::MakeUnique<ColorTransformSkTransferFn>(
-        from_linear_fn, to.HasExtendedSkTransferFn()));
+        dst_from_linear_fn, dst.HasExtendedSkTransferFn()));
   } else {
-    steps_.push_back(base::MakeUnique<ColorTransformFromLinear>(to.transfer_));
+    steps_.push_back(base::MakeUnique<ColorTransformFromLinear>(dst.transfer_));
   }
 
   steps_.push_back(
-      base::MakeUnique<ColorTransformMatrix>(GetTransferMatrix(to)));
+      base::MakeUnique<ColorTransformMatrix>(GetTransferMatrix(dst)));
 
-  steps_.push_back(
-      base::MakeUnique<ColorTransformMatrix>(Invert(GetRangeAdjustMatrix(to))));
+  steps_.push_back(base::MakeUnique<ColorTransformMatrix>(
+      Invert(GetRangeAdjustMatrix(dst))));
 }
 
-// TODO(ccameron): Change this to SkColorSpaceXform.
-class QCMSColorTransform : public ColorTransformStep {
+class SkiaColorTransform : public ColorTransformStep {
  public:
   // Takes ownership of the profiles
-  QCMSColorTransform(ScopedQcmsProfile from, ScopedQcmsProfile to)
-      : from_(std::move(from)), to_(std::move(to)) {}
-  ~QCMSColorTransform() override {}
-  QCMSColorTransform* GetQCMS() override { return this; }
+  SkiaColorTransform(sk_sp<SkColorSpace> src, sk_sp<SkColorSpace> dst)
+      : src_(src), dst_(dst) {}
+  ~SkiaColorTransform() override {
+    src_ = nullptr;
+    dst_ = nullptr;
+  }
+  SkiaColorTransform* GetSkia() override { return this; }
   bool Join(ColorTransformStep* next_untyped) override {
-    QCMSColorTransform* next = next_untyped->GetQCMS();
+    SkiaColorTransform* next = next_untyped->GetSkia();
     if (!next)
       return false;
-    if (qcms_profile_match(to_.get(), next->from_.get())) {
-      to_ = std::move(next->to_);
+    if (SkColorSpace::Equals(dst_.get(), next->src_.get())) {
+      dst_ = next->dst_;
       return true;
     }
     return false;
   }
   bool IsNull() override {
-    if (qcms_profile_match(from_.get(), to_.get()))
+    if (SkColorSpace::Equals(src_.get(), dst_.get()))
       return true;
     return false;
   }
   void Transform(ColorTransform::TriStim* colors, size_t num) const override {
-    CHECK(sizeof(ColorTransform::TriStim) == sizeof(float[3]));
-    // QCMS doesn't like numbers outside 0..1
-    for (size_t i = 0; i < num; i++) {
-      colors[i].set_x(min(1.0f, max(0.0f, colors[i].x())));
-      colors[i].set_y(min(1.0f, max(0.0f, colors[i].y())));
-      colors[i].set_z(min(1.0f, max(0.0f, colors[i].z())));
+    // Transform to SkColors.
+    std::vector<uint8_t> sk_colors(4 * num);
+    for (size_t i = 0; i < num; ++i) {
+      float rgb[3] = {colors[i].x(), colors[i].y(), colors[i].z()};
+      for (size_t c = 0; c < 3; ++c) {
+        int value_int = static_cast<int>(255.f * rgb[c] + 0.5f);
+        value_int = min(value_int, 255);
+        value_int = max(value_int, 0);
+        sk_colors[4 * i + c] = value_int;
+      }
+      sk_colors[4 * i + 3] = 255;
     }
-    qcms_chain_transform(from_.get(), to_.get(),
-                         reinterpret_cast<float*>(colors),
-                         reinterpret_cast<float*>(colors), num * 3);
+
+    // Perform the transform.
+    std::unique_ptr<SkColorSpaceXform> xform =
+        SkColorSpaceXform::New(src_.get(), dst_.get());
+    DCHECK(xform);
+    if (!xform)
+      return;
+    std::vector<uint8_t> sk_colors_transformed(4 * num);
+    bool xform_apply_result = xform->apply(
+        SkColorSpaceXform::kRGBA_8888_ColorFormat, sk_colors_transformed.data(),
+        SkColorSpaceXform::kRGBA_8888_ColorFormat, sk_colors.data(), num,
+        kOpaque_SkAlphaType);
+    DCHECK(xform_apply_result);
+    sk_colors = sk_colors_transformed;
+
+    // Convert back to TriStim.
+    for (size_t i = 0; i < num; ++i) {
+      colors[i].set_x(sk_colors[4 * i + 0] / 255.f);
+      colors[i].set_y(sk_colors[4 * i + 1] / 255.f);
+      colors[i].set_z(sk_colors[4 * i + 2] / 255.f);
+    }
   }
 
  private:
-  ScopedQcmsProfile from_;
-  ScopedQcmsProfile to_;
+  sk_sp<SkColorSpace> src_;
+  sk_sp<SkColorSpace> dst_;
 };
 
-ScopedQcmsProfile ColorTransformInternal::GetQCMSProfileIfNecessary(
+sk_sp<SkColorSpace> ColorTransformInternal::GetSkColorSpaceIfNecessary(
     const ColorSpace& color_space) {
   if (color_space.primaries_ != ColorSpace::PrimaryID::ICC_BASED &&
       color_space.transfer_ != ColorSpace::TransferID::ICC_BASED) {
     return nullptr;
   }
-  // TODO(ccameron): Use SkColorSpaceXform here to avoid looking up the
-  // ICCProfile.
-  ICCProfile icc_profile;
-  if (!ICCProfile::FromId(color_space.icc_profile_id_, &icc_profile)) {
-    // We needed the original ICC profile to construct this transform, but it
-    // has been flushed from our cache. Fall back to using the ICC profile's
-    // inaccurate, so spam the console.
-    // TODO(ccameron): This will go away when we switch to SkColorSpaceXform.
-    LOG(ERROR) << "Failed to retrieve original ICC profile, using sRGB";
-    return ScopedQcmsProfile(qcms_profile_sRGB());
-  }
-  return ScopedQcmsProfile(qcms_profile_from_memory(
-      icc_profile.GetData().data(), icc_profile.GetData().size()));
+  DCHECK(color_space.icc_profile_sk_color_space_);
+  return color_space.icc_profile_sk_color_space_;
 }
-
-ScopedQcmsProfile GetXYZD50Profile() {
-  // QCMS is trixy, it has a datatype called qcms_CIE_xyY, but what it expects
-  // is in fact not xyY color coordinates, it just wants the x/y values of the
-  // primaries with Y equal to 1.0.
-  qcms_CIE_xyYTRIPLE xyz;
-  qcms_CIE_xyY w;
-  xyz.red.x = 1.0f;
-  xyz.red.y = 0.0f;
-  xyz.red.Y = 1.0f;
-  xyz.green.x = 0.0f;
-  xyz.green.y = 1.0f;
-  xyz.green.Y = 1.0f;
-  xyz.blue.x = 0.0f;
-  xyz.blue.y = 0.0f;
-  xyz.blue.Y = 1.0f;
-  w.x = 0.34567f;
-  w.y = 0.35850f;
-  w.Y = 1.0f;
-  return ScopedQcmsProfile(qcms_profile_create_rgb_with_gamma(w, xyz, 1.0f));
-}
-
 ColorTransformInternal::ColorTransformInternal(const ColorSpace& src,
                                                const ColorSpace& dst,
                                                Intent intent)
@@ -1003,27 +979,30 @@
   // If the target color space is not defined, just apply the adjust and
   // tranfer matrices. This path is used by YUV to RGB color conversion
   // when full color conversion is not enabled.
-  ScopedQcmsProfile src_profile;
-  ScopedQcmsProfile dst_profile;
+  sk_sp<SkColorSpace> src_sk_color_space;
+  sk_sp<SkColorSpace> dst_sk_color_space;
+
+  bool has_src_profile = false;
+  bool has_dst_profile = false;
   if (dst.IsValid()) {
-    src_profile = GetQCMSProfileIfNecessary(src_);
-    dst_profile = GetQCMSProfileIfNecessary(dst_);
+    src_sk_color_space = GetSkColorSpaceIfNecessary(src_);
+    dst_sk_color_space = GetSkColorSpaceIfNecessary(dst_);
   }
-  bool has_src_profile = !!src_profile;
-  bool has_dst_profile = !!dst_profile;
+  has_src_profile = !!src_sk_color_space;
+  has_dst_profile = !!dst_sk_color_space;
 
-  if (src_profile) {
-    steps_.push_back(base::MakeUnique<QCMSColorTransform>(
-        std::move(src_profile), GetXYZD50Profile()));
+  if (has_src_profile) {
+    steps_.push_back(base::MakeUnique<SkiaColorTransform>(
+        std::move(src_sk_color_space),
+        ColorSpace::CreateXYZD50().ToSkColorSpace()));
   }
-
   AppendColorSpaceToColorSpaceTransform(
       has_src_profile ? ColorSpace::CreateXYZD50() : src_,
       has_dst_profile ? ColorSpace::CreateXYZD50() : dst_, intent);
-
-  if (dst_profile) {
-    steps_.push_back(base::MakeUnique<QCMSColorTransform>(
-        GetXYZD50Profile(), std::move(dst_profile)));
+  if (has_dst_profile) {
+    steps_.push_back(base::MakeUnique<SkiaColorTransform>(
+        ColorSpace::CreateXYZD50().ToSkColorSpace(),
+        std::move(dst_sk_color_space)));
   }
 
   if (intent != Intent::TEST_NO_OPT)
@@ -1087,11 +1066,11 @@
 
 // static
 std::unique_ptr<ColorTransform> ColorTransform::NewColorTransform(
-    const ColorSpace& from,
-    const ColorSpace& to,
+    const ColorSpace& src,
+    const ColorSpace& dst,
     Intent intent) {
   return std::unique_ptr<ColorTransform>(
-      new ColorTransformInternal(from, to, intent));
+      new ColorTransformInternal(src, dst, intent));
 }
 
 ColorTransform::ColorTransform() {}
diff --git a/ui/gfx/icc_profile.cc b/ui/gfx/icc_profile.cc
index d2ddfef..b845c7d8 100644
--- a/ui/gfx/icc_profile.cc
+++ b/ui/gfx/icc_profile.cc
@@ -9,6 +9,7 @@
 #include "base/containers/mru_cache.h"
 #include "base/lazy_instance.h"
 #include "base/synchronization/lock.h"
+#include "third_party/skia/include/core/SkColorSpaceXform.h"
 #include "third_party/skia/include/core/SkICC.h"
 #include "ui/gfx/color_transform.h"
 #include "ui/gfx/skia_color_space_util.h"
@@ -71,10 +72,8 @@
 ICCProfile ICCProfile::FromDataWithId(const void* data,
                                       size_t size,
                                       uint64_t new_profile_id) {
-  if (!size) {
-    DLOG(ERROR) << "Invalid empty ICC profile.";
+  if (!size)
     return ICCProfile();
-  }
 
   const char* data_as_char = reinterpret_cast<const char*>(data);
   {
@@ -176,8 +175,20 @@
     }
   }
 
+  // Parse the profile and attempt to create a SkColorSpaceXform out of it.
+  sk_sp<SkColorSpace> sk_srgb_color_space = SkColorSpace::MakeSRGB();
   sk_sp<SkICC> sk_icc = SkICC::Make(data_.data(), data_.size());
-  if (sk_icc) {
+  sk_sp<SkColorSpace> sk_icc_color_space;
+  std::unique_ptr<SkColorSpaceXform> sk_color_space_xform;
+  if (sk_icc)
+    sk_icc_color_space = SkColorSpace::MakeICC(data_.data(), data_.size());
+  if (sk_icc_color_space) {
+    sk_color_space_xform = SkColorSpaceXform::New(sk_srgb_color_space.get(),
+                                                  sk_icc_color_space.get());
+  }
+
+  // Attempt to extract a parametric represetation for this space.
+  if (sk_color_space_xform) {
     bool parametric_color_space_is_accurate = false;
     successfully_parsed_by_sk_icc_ = true;
 
@@ -226,11 +237,14 @@
       color_space_ = ColorSpace(ColorSpace::PrimaryID::ICC_BASED,
                                 ColorSpace::TransferID::ICC_BASED);
       color_space_.icc_profile_id_ = id_;
-      color_space_.icc_profile_sk_color_space_ =
-          SkColorSpace::MakeICC(data_.data(), data_.size());
+      color_space_.icc_profile_sk_color_space_ = sk_icc_color_space;
     }
+  } else if (sk_icc_color_space) {
+    DLOG(ERROR) << "Parsed ICCProfile, but unable to create an "
+                   "SkColorSpaceXform from it.";
+    successfully_parsed_by_sk_icc_ = false;
   } else {
-    DLOG(ERROR) << "Unable parse ICCProfile.";
+    DLOG(ERROR) << "Unable to parse ICCProfile.";
     successfully_parsed_by_sk_icc_ = false;
   }
 
diff --git a/ui/gfx/icc_profile_unittest.cc b/ui/gfx/icc_profile_unittest.cc
index 35d8edc..ebf652e 100644
--- a/ui/gfx/icc_profile_unittest.cc
+++ b/ui/gfx/icc_profile_unittest.cc
@@ -93,13 +93,11 @@
       &accurate_parametric_color_space));
   EXPECT_EQ(accurate_parametric_color_space, accurate);
 
-  // This ICC profile has only an A2B representation. For now, this means that
-  // the parametric representation will be sRGB. We will eventually want to get
-  // some sense of the gamut.
+  // This ICC profile has only an A2B representation. We cannot create an
+  // SkColorSpaceXform to A2B only ICC profiles, so this should be marked
+  // as invalid.
   ICCProfile a2b = ICCProfileForTestingA2BOnly();
-  EXPECT_TRUE(a2b.GetColorSpace().IsValid());
-  EXPECT_NE(a2b.GetColorSpace(), a2b.GetParametricColorSpace());
-  EXPECT_EQ(ColorSpace::CreateSRGB(), a2b.GetParametricColorSpace());
+  EXPECT_FALSE(a2b.GetColorSpace().IsValid());
 }
 
 TEST(ICCProfile, GarbageData) {
diff --git a/ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc b/ui/gfx/linux/client_native_pixmap_dmabuf.cc
similarity index 91%
rename from ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc
rename to ui/gfx/linux/client_native_pixmap_dmabuf.cc
index 8b4a0196..d656c338 100644
--- a/ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc
+++ b/ui/gfx/linux/client_native_pixmap_dmabuf.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.h"
+#include "ui/gfx/linux/client_native_pixmap_dmabuf.h"
 
 #include <fcntl.h>
 #include <linux/version.h>
@@ -39,7 +39,7 @@
 #include <linux/dma-buf.h>
 #endif
 
-namespace ui {
+namespace gfx {
 
 namespace {
 
@@ -47,16 +47,22 @@
   struct local_dma_buf_sync sync_start = {0};
 
   sync_start.flags = LOCAL_DMA_BUF_SYNC_START | LOCAL_DMA_BUF_SYNC_RW;
-  if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_start))
-    PLOG(ERROR) << "Failed DMA_BUF_SYNC_START";
+#if DCHECK_IS_ON()
+  int rv =
+#endif
+      drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_start);
+  DPLOG_IF(ERROR, rv) << "Failed DMA_BUF_SYNC_START";
 }
 
 void PrimeSyncEnd(int dmabuf_fd) {
   struct local_dma_buf_sync sync_end = {0};
 
   sync_end.flags = LOCAL_DMA_BUF_SYNC_END | LOCAL_DMA_BUF_SYNC_RW;
-  if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_end))
-    PLOG(ERROR) << "Failed DMA_BUF_SYNC_END";
+#if DCHECK_IS_ON()
+  int rv =
+#endif
+      drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_end);
+  DPLOG_IF(ERROR, rv) << "Failed DMA_BUF_SYNC_END";
 }
 
 }  // namespace
@@ -147,4 +153,4 @@
   return pixmap_handle_.planes[plane].stride;
 }
 
-}  // namespace ui
+}  // namespace gfx
diff --git a/ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.h b/ui/gfx/linux/client_native_pixmap_dmabuf.h
similarity index 82%
rename from ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.h
rename to ui/gfx/linux/client_native_pixmap_dmabuf.h
index 6425e66..b8f5630e 100644
--- a/ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.h
+++ b/ui/gfx/linux/client_native_pixmap_dmabuf.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_OZONE_PLATFORM_DRM_COMMON_CLIENT_NATIVE_PIXMAP_DMABUF_H_
-#define UI_OZONE_PLATFORM_DRM_COMMON_CLIENT_NATIVE_PIXMAP_DMABUF_H_
+#ifndef UI_GFX_LINUX_CLIENT_NATIVE_PIXMAP_DMABUF_H_
+#define UI_GFX_LINUX_CLIENT_NATIVE_PIXMAP_DMABUF_H_
 
 #include <stdint.h>
 
@@ -15,7 +15,7 @@
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/native_pixmap_handle.h"
 
-namespace ui {
+namespace gfx {
 
 class ClientNativePixmapDmaBuf : public gfx::ClientNativePixmap {
  public:
@@ -44,6 +44,6 @@
   DISALLOW_COPY_AND_ASSIGN(ClientNativePixmapDmaBuf);
 };
 
-}  // namespace ui
+}  // namespace gfx
 
-#endif  // UI_OZONE_PLATFORM_DRM_COMMON_CLIENT_NATIVE_PIXMAP_DMABUF_H_
+#endif  // UI_GFX_LINUX_CLIENT_NATIVE_PIXMAP_DMABUF_H_
diff --git a/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc b/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc
new file mode 100644
index 0000000..a91e5064
--- /dev/null
+++ b/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc
@@ -0,0 +1,123 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/linux/client_native_pixmap_factory_dmabuf.h"
+
+#include <utility>
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/trace_event/trace_event.h"
+#include "ui/gfx/native_pixmap_handle.h"
+
+#if defined(OS_CHROMEOS)
+// This can be enabled on all linux but it is not a requirement to support
+// glCreateImageChromium+Dmabuf since it uses gfx::BufferUsage::SCANOUT and
+// the pixmap does not need to be mappable on the client side.
+#include "ui/gfx/linux/client_native_pixmap_dmabuf.h"
+#endif
+
+namespace gfx {
+
+namespace {
+
+class ClientNativePixmapOpaque : public ClientNativePixmap {
+ public:
+  ClientNativePixmapOpaque() {}
+  ~ClientNativePixmapOpaque() override {}
+
+  bool Map() override {
+    NOTREACHED();
+    return false;
+  }
+  void Unmap() override { NOTREACHED(); }
+  void* GetMemoryAddress(size_t plane) const override {
+    NOTREACHED();
+    return nullptr;
+  }
+  int GetStride(size_t plane) const override {
+    NOTREACHED();
+    return 0;
+  }
+};
+
+}  // namespace
+
+class ClientNativePixmapFactoryDmabuf : public ClientNativePixmapFactory {
+ public:
+  ClientNativePixmapFactoryDmabuf() {}
+  ~ClientNativePixmapFactoryDmabuf() override {}
+
+  // ClientNativePixmapFactory:
+  bool IsConfigurationSupported(gfx::BufferFormat format,
+                                gfx::BufferUsage usage) const override {
+    switch (usage) {
+      case gfx::BufferUsage::GPU_READ:
+        return format == gfx::BufferFormat::BGR_565 ||
+               format == gfx::BufferFormat::RGBA_8888 ||
+               format == gfx::BufferFormat::RGBX_8888 ||
+               format == gfx::BufferFormat::BGRA_8888 ||
+               format == gfx::BufferFormat::BGRX_8888 ||
+               format == gfx::BufferFormat::YVU_420;
+      case gfx::BufferUsage::SCANOUT:
+        return format == gfx::BufferFormat::BGRX_8888 ||
+               format == gfx::BufferFormat::RGBX_8888;
+      case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
+        return format == gfx::BufferFormat::BGRX_8888 ||
+               format == gfx::BufferFormat::BGRA_8888 ||
+               format == gfx::BufferFormat::RGBX_8888 ||
+               format == gfx::BufferFormat::RGBA_8888;
+      case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
+      case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: {
+#if defined(OS_CHROMEOS)
+        return
+#if defined(ARCH_CPU_X86_FAMILY)
+            // Currently only Intel driver (i.e. minigbm and Mesa) supports R_8
+            // and RG_88. crbug.com/356871
+            format == gfx::BufferFormat::R_8 ||
+            format == gfx::BufferFormat::RG_88 ||
+#endif
+            format == gfx::BufferFormat::BGRA_8888;
+#else
+        return false;
+#endif
+      }
+    }
+    NOTREACHED();
+    return false;
+  }
+  std::unique_ptr<ClientNativePixmap> ImportFromHandle(
+      const gfx::NativePixmapHandle& handle,
+      const gfx::Size& size,
+      gfx::BufferUsage usage) override {
+    DCHECK(!handle.fds.empty());
+    switch (usage) {
+      case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
+      case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
+      case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
+#if defined(OS_CHROMEOS)
+        return ClientNativePixmapDmaBuf::ImportFromDmabuf(handle, size);
+#else
+        NOTREACHED();
+        return nullptr;
+#endif
+      case gfx::BufferUsage::GPU_READ:
+      case gfx::BufferUsage::SCANOUT:
+        // Close all the fds.
+        for (const auto& fd : handle.fds)
+          base::ScopedFD scoped_fd(fd.fd);
+        return base::WrapUnique(new ClientNativePixmapOpaque);
+    }
+    NOTREACHED();
+    return nullptr;
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(ClientNativePixmapFactoryDmabuf);
+};
+
+ClientNativePixmapFactory* CreateClientNativePixmapFactoryDmabuf() {
+  return new ClientNativePixmapFactoryDmabuf();
+}
+
+}  // namespace gfx
diff --git a/ui/gfx/linux/client_native_pixmap_factory_dmabuf.h b/ui/gfx/linux/client_native_pixmap_factory_dmabuf.h
new file mode 100644
index 0000000..7f802a6
--- /dev/null
+++ b/ui/gfx/linux/client_native_pixmap_factory_dmabuf.h
@@ -0,0 +1,17 @@
+// 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 UI_GFX_LINUX_CLIENT_NATIVE_PIXMAP_FACTORY_DMABUF_H_
+#define UI_GFX_LINUX_CLIENT_NATIVE_PIXMAP_FACTORY_DMABUF_H_
+
+#include "ui/gfx/client_native_pixmap_factory.h"
+#include "ui/gfx/gfx_export.h"
+
+namespace gfx {
+
+GFX_EXPORT ClientNativePixmapFactory* CreateClientNativePixmapFactoryDmabuf();
+
+}  // namespace gfx
+
+#endif  // UI_GFX_LINUX_CLIENT_NATIVE_PIXMAP_FACTORY_DMABUF_H_
diff --git a/ui/ozone/platform/drm/BUILD.gn b/ui/ozone/platform/drm/BUILD.gn
index d07dc4f..9f3135f2 100644
--- a/ui/ozone/platform/drm/BUILD.gn
+++ b/ui/ozone/platform/drm/BUILD.gn
@@ -11,8 +11,6 @@
   sources = [
     "client_native_pixmap_factory_gbm.cc",
     "client_native_pixmap_factory_gbm.h",
-    "common/client_native_pixmap_dmabuf.cc",
-    "common/client_native_pixmap_dmabuf.h",
     "common/drm_util.cc",
     "common/drm_util.h",
     "common/scoped_drm_types.cc",
diff --git a/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc b/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc
index 090b048..f8dd781 100644
--- a/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc
+++ b/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc
@@ -8,110 +8,13 @@
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "ui/gfx/client_native_pixmap_factory.h"
+#include "ui/gfx/linux/client_native_pixmap_factory_dmabuf.h"
 #include "ui/gfx/native_pixmap_handle.h"
-#include "ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.h"
 
 namespace ui {
 
-namespace {
-
-class ClientNativePixmapGbm : public gfx::ClientNativePixmap {
- public:
-  ClientNativePixmapGbm() {}
-  ~ClientNativePixmapGbm() override {}
-
-  bool Map() override {
-    NOTREACHED();
-    return false;
-  }
-  void Unmap() override { NOTREACHED(); }
-  void* GetMemoryAddress(size_t plane) const override {
-    NOTREACHED();
-    return nullptr;
-  }
-  int GetStride(size_t plane) const override {
-    NOTREACHED();
-    return 0;
-  }
-};
-
-}  // namespace
-
-class ClientNativePixmapFactoryGbm : public gfx::ClientNativePixmapFactory {
- public:
-  ClientNativePixmapFactoryGbm() {}
-  ~ClientNativePixmapFactoryGbm() override {}
-
-  // ClientNativePixmapFactory:
-  bool IsConfigurationSupported(gfx::BufferFormat format,
-                                gfx::BufferUsage usage) const override {
-    switch (usage) {
-      case gfx::BufferUsage::GPU_READ:
-        return format == gfx::BufferFormat::BGR_565 ||
-               format == gfx::BufferFormat::RGBA_8888 ||
-               format == gfx::BufferFormat::RGBX_8888 ||
-               format == gfx::BufferFormat::BGRA_8888 ||
-               format == gfx::BufferFormat::BGRX_8888 ||
-               format == gfx::BufferFormat::YVU_420;
-      case gfx::BufferUsage::SCANOUT:
-        return format == gfx::BufferFormat::BGRX_8888 ||
-               format == gfx::BufferFormat::RGBX_8888;
-      case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
-        return format == gfx::BufferFormat::BGRX_8888 ||
-               format == gfx::BufferFormat::BGRA_8888 ||
-               format == gfx::BufferFormat::RGBX_8888 ||
-               format == gfx::BufferFormat::RGBA_8888;
-      case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
-      case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: {
-#if defined(OS_CHROMEOS)
-        return
-#if defined(ARCH_CPU_X86_FAMILY)
-            // Currently only Intel driver (i.e. minigbm and Mesa) supports R_8
-            // and RG_88. crbug.com/356871
-            format == gfx::BufferFormat::R_8 ||
-            format == gfx::BufferFormat::RG_88 ||
-#endif
-            format == gfx::BufferFormat::BGRA_8888;
-#else
-        return false;
-#endif
-      }
-    }
-    NOTREACHED();
-    return false;
-  }
-  std::unique_ptr<gfx::ClientNativePixmap> ImportFromHandle(
-      const gfx::NativePixmapHandle& handle,
-      const gfx::Size& size,
-      gfx::BufferUsage usage) override {
-    DCHECK(!handle.fds.empty());
-    switch (usage) {
-      case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
-      case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
-      case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
-#if defined(OS_CHROMEOS)
-        return ClientNativePixmapDmaBuf::ImportFromDmabuf(handle, size);
-#else
-        NOTREACHED();
-        return nullptr;
-#endif
-      case gfx::BufferUsage::GPU_READ:
-      case gfx::BufferUsage::SCANOUT:
-        // Close all the fds.
-        for (const auto& fd : handle.fds)
-          base::ScopedFD scoped_fd(fd.fd);
-        return base::WrapUnique(new ClientNativePixmapGbm);
-    }
-    NOTREACHED();
-    return nullptr;
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(ClientNativePixmapFactoryGbm);
-};
-
 gfx::ClientNativePixmapFactory* CreateClientNativePixmapFactoryGbm() {
-  return new ClientNativePixmapFactoryGbm();
+  return gfx::CreateClientNativePixmapFactoryDmabuf();
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/drm_device.cc b/ui/ozone/platform/drm/gpu/drm_device.cc
index f2e2d72..81098fa 100644
--- a/ui/ozone/platform/drm/gpu/drm_device.cc
+++ b/ui/ozone/platform/drm/gpu/drm_device.cc
@@ -679,18 +679,6 @@
 bool DrmDevice::SetCapability(uint64_t capability, uint64_t value) {
   DCHECK(file_.IsValid());
 
-#ifndef DRM_IOCTL_SET_CLIENT_CAP
-// drmSetClientCap was introduced in a later version of libdrm than the wheezy
-// sysroot supplies.
-// TODO(thomasanderson): Remove this when support for the wheezy sysroot is
-// dropped in favor of jessie.
-#define DRM_IOCTL_SET_CLIENT_CAP DRM_IOW(0x0d, struct drm_set_client_cap)
-  struct drm_set_client_cap {
-    __u64 capability;
-    __u64 value;
-  };
-#endif
-
   struct drm_set_client_cap cap = {capability, value};
   return !drmIoctl(file_.GetPlatformFile(), DRM_IOCTL_SET_CLIENT_CAP, &cap);
 }